我想在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方法错误
理想的做法是什么?
感谢您的时间。
答案 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)