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

read csv file(numeric type) in scala

我想在 scala 中读取 csv 文件。

  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 方法错误

理想的做法是什么?

感谢您的宝贵时间。

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

我建议不要手动解析 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)