2016-04-24 18 views
0

Ich möchte CSV-Datei in Scala lesen.lesen CSV-Datei (numerischer Typ) in Scala

enter image description here

val rows = ArrayBuffer[Array[String]]() 

     using(io.Source.fromFile("test.csv")) { source => 
     for (line <- source.getLines) { 
      rows += line.split(",").map(_.trim) 
      } 
     }  
     def using[A <: { def close(): Unit }, B](resource: A)(f: A => B): B = 
     try { 
      f(resource) 
     }finally { 
      resource.close() 
      } 

ich oben Code verwendet CSV-Datei zu lesen.

Ich bekomme ArrayBuffer (Array [String]) jetzt, aber ich möchte ArrayBuffer (Array [Double]) bekommen.

ToDouble Methode ist falsch

Was der ideale Weg ist zu tun?

Vielen Dank für Ihre Zeit.

Antwort

3

toDouble ist richtig, rufen Sie es einfach auf Strings.

rows.map(_.map(_.toDouble)) 

oder direkt in Ihrem Code

using(io.Source.fromFile("test.csv")) { source => 
    for (line <- source.getLines) { 
    rows += line.split(",").map(_.trim).map(_.toDouble) 
    } 
} 

wandelbar Sammlungen vermeiden Sie Listen nutzen könnten, wie folgt aus:

val rows: List[List[Double]] = using(io.Source.fromFile("test.csv")) { source => 
    source.getLines.toList map { line => 
    line.split(",").map(_.trim.toDouble).toList 
    } 
} 
+0

Danke für Ihre Hilfe –

0

ich CSV empfehlen würde gegen das Parsen von Hand, werden Sie die meisten wahrscheinlich kommt es irgendwann zu einem der ärgerlichen Randfälle (Werte mit z. B. Zeilen- oder Spaltentrennzeichen). Es ist oft besser und sicherer dedizierte Bibliotheken zu verwenden.

Ich werde kantan.csv empfehlen, weil ich der Autor bin, aber es gibt viele andere Qualitätsbibliotheken da draußen (Produkt-Sammlungen, reines csv ...).

Mit kantan.csv, würde Ihr Problem thusly gelöst werden:

import kantan.csv.ops._ 

// For an immutable structure. 
new java.io.File("test.csv").readCsv[List, List[Double]](',', false) 

// For an Array, as in your example. 
new java.io.File("test.csv").readCsv[Array, Array[Double]](',', false)