在scala中读取csv文件(数字类型)

时间:2016-04-24 07:29:42

标签: scala csv readfile

我想在scala中阅读csv文件。

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()
            } 

我使用上面的代码来读取csv文件。

我现在得到ArrayBuffer(Array [String]),但我想得到ArrayBuffer(Array [Double])。

toDouble方法错误

理想的做法是什么?

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

toDouble是对的,只需在字符串上调用它即可。

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

或者在您的代码中

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

为避免可变集合,您可以使用列表,如下所示:

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

答案 1 :(得分:0)

我建议不要手动解析CSV,你很可能最终会遇到一个恼人的边缘情况(例如,带有行或列分隔符的值)。使用专用库通常更好,更安全。

我会推荐kantan.csv,因为我是作者,但还有很多其他高质量的图书馆(产品系列,纯粹的csv ......)。

使用kantan.csv,你的问题就会得到解决:

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)