在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)
我想在 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)