2017-04-09 1 views
-1

Ich lese eine Datei und die Datei hat einige fehlende Werte, ich muss es mit Wert als "MISSING" aktualisieren.Handle Fehlende Werte in Datei mit Hilfe von Scala

package HW9 

    object WeatherStub { 

// Zuordnung Dateiname
val filename = "weather.csv"

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

// Aufruf der Lese Wetter Methode readWeather (filename)

 } 

    //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) 

     } 
     } 

     } 

Beispieldaten aus Datei: -

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

können Sie Ihre Frage richtig formatieren? – jamborta

Antwort

1

Wenn Sie einige der Beispiele Ihrer Daten ausführen:

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

Sie sehen, dass Sie nur den ersten Wert in der Liste bekommen, daher der IndexOutOfBoundsException Fehler. Sie können dieses Verhalten wie folgt deaktivieren:

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

einen Blick auf diesen Thread haben, der erklärt, warum: Java String split removed empty values

EDIT:

Es gibt zwei Dinge im Code, die keinen Sinn machen , die Definition von IsEmptyOrNull nimmt eine String, so dass nie im try Block fehlschlagen würde, daher würde es niemals keine zurückgeben. Auch line.split würde immer eine Array[String] zurückgeben, so dass die Elemente bereits String sind. Man könnte denken, wie leer und fehlende Werte in den Daten dargestellt werden, und ersetzen IsEmptyOrNull mit etwas wie folgt aus:

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

Das ist ein guter Fang. Vielen Dank!!. Ich bin in der Lage, diese Inbound-Fehler Ausnahme zu beheben, aber der Wert "Missing" wird überhaupt nicht gedruckt. Nicht sicher warum?? – Issaq