2017-04-09 2 views
-1
I have read file using scala and for the missing values i have to print as "Missing". I have used case/match/Some/Option to handle it. I end up with "IndexOutOfBound" exception. I have used try catch as well in the code but no luck. Any help will be appreciated ?? 

ファイルを読み取っていますが、ファイルにいくつかの欠損値があります。値が「MISSING」として値を更新する必要があります。Handleスカラーを使用したファイルの値が欠落しています

package HW9 

    object WeatherStub { 

//割り当てファイル名
ヴァルfileNameに= "weather.csv"

 def main(args: Array[String]): Unit = { 

//

 } 

    //Method to handle missing and exception 
     def readWeather(fn: String): Unit = { 
     var weatherMuteMap = scala.collection.mutable.Map[String, String]() 
     def IsEmptyOrNull(s:String): Option[String] = {try {Some(s.toString)} catch {case _ => None}} 

    //Reading files 
     for(line <- io.Source.fromFile(fn).getLines()){ 
      val list1 = line.split(",").map(_.trim).toList 

    //Handling missing values 
      val TotalPrecp = IsEmptyOrNull(list1(1).toString) match { case Some(i) => i case _ => "Missing"} 
      val LowPrecp = IsEmptyOrNull(list1(2).toString) match { case Some(i) => i case _ => "Missing" } 
      val HighPrecp = IsEmptyOrNull(list1(3).toString) match { case Some(i) => i case _ => "Missing" } 

//Concatenating values to a map 
      weatherMuteMap(list1(0)) = TotalPrecp + LowPrecp + HighPrecp 
//Print  
      println(weatherMuteMap) 

     } 
     } 

     } 

読み取り天気方法 readWeather(ファイル名)を呼び出すサンプルデータファイルから: -

2016-01-01,0,-13.28,-1.11 
    2016-01-02,0,-10,0 
    2016-01-03,0,-10,0 
    2016-01-04,0,-12.78,-2.22 
    2016-01-06,0,-6.11,0.61 
    2016-01-07,0.05,-0.61,1 
    2016-01-08,0.1,,1 
    2016-01-09,0.13,-5.61,0 
    2016-01-21,0,, 
    2016-01-22,0,, 
    2016-01-23,,-9.39,-6.11 
    2016-02-19,0,, 
    2016-02-20,0,0,0 
    2016-02-21,,, 
    2016-02-22,0,-0.61,0.61 
    2016-02-23,,, 

    Error:- 

    Exception in thread "main" java.lang.IndexOutOfBoundsException: 2 
     at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65) 
     at scala.collection.immutable.List.apply(List.scala:84) 
     at HW9.WeatherStub$$anonfun$readWeather$1.apply(WeatherStub.scala:19) 
     at HW9.WeatherStub$$anonfun$readWeather$1.apply(WeatherStub.scala:16) 
     at scala.collection.Iterator$class.foreach(Iterator.scala:893) 
     at scala.collection.AbstractIterator.foreach(Iterator.scala:1336) 
     at HW9.WeatherStub$.readWeather(WeatherStub.scala:16) 
     at HW9.WeatherStub$.main(WeatherStub.scala:8) 
     at HW9.WeatherStub.main(WeatherStub.scala) 

    Process finished with exit code 1 
+2

質問を正しくフォーマットできますか? – jamborta

答えて

1

あなたはあなたのデータの例のいくつかを実行する場合:

scala> val str = "2016-02-23,,," 
scala> str.split(",").map(_.trim).toList 
res0: List[String] = List(2016-02-23) 

あなたが唯一、したがってはIndexOutOfBoundsExceptionエラー、リスト内の最初の値を取得していることがわかります。あなたはこのように、この動作をオフにすることができます

scala> str.split(",", -1).map(_.trim).toList 
res1: List[String] = List(2016-02-23, "", "", "") 

は、理由を説明し、このスレッドを見てください:Java String split removed empty values

EDIT:

意味がありませんあなたのコード内の2つのものがあります。 IsEmptyOrNullの定義はStringとなり、tryブロックで決して失敗することはないため、Noneを返すことはありません。またline.splitは常にArray[String]を返すので、要素はすでにStringです。空で欠損値がどのようにデータに表示されているかを考えてみてください。

def IsEmptyOrNull(s: String): Option[String] = { 
    s match { 
    case "" => None 
    case _ => Some(s) 
    } 
} 
+0

それは良いキャッチです。ありがとう!!私はそのインバウンドエラー例外を修正することができますが、値 "Missing"はまだ印刷されていません。わからない理由は? – Issaq

関連する問題