如何读取文件并在scala中拆分

how to read file and split in scala

如果我有一个文件(如 csv、txt...)。

我希望得到两个数组,例如

Array(Array(1.0,2.0),Array(4.0,5.0),Array(7.0, 8.0),Array(10.0,11.0),Array(13.0,14.0))

Array(3.0, 6.0, 9.0, 12.0, 15.0)

在 Scala 中执行此操作的理想方法是什么?

val rdd = sc.textFile("1.csv").map(_.split(',').map(_.trim().toDouble))

rdd.map(_.take(2)).collect()
res0: Array[Array[Double]] = Array(Array(1.0, 2.0), Array(4.0, 5.0), Array(7.0, 8.0), Array(10.0, 11.0), Array(13.0, 14.0))

rdd.map(_(2)).collect()
res2: Array[Double] = Array(3.0, 6.0, 9.0, 12.0, 15.0)

类似于 @Vitaliy Kotlyarenko 的回答,但没有使用像 Spark 这样的第三方(如果你的数据很大,Spark 就很棒,但否则就太过分了):

val lines: Iterator[String] = scala.io.Source.fromFile("txt.csv").getLines()
val matrix: Array[Array[Double]] = lines.map(_.split(",").map(_.trim.toDouble)).toArray
val twoFirstColumns: Array[Array[Double]] = matrix.map(_.take(2))
val thirdColumn: Array[Double] = matrix.map(_(2))

可以一次得到两个数组,这样就不用遍历两次数据了:

val (first, second) = {
  io.Source.fromFile(name).getLines
   .map(_.split(",").map(_.toDouble))
   .foldRight(Seq.empty[Array[Double]] -> Seq.empty[Double]) {
      case (Array(x, y, z), (as, bs)) => (Array(x, y) +: as, z +: bs)
    }
}

现在,您最终得到两个列表而不是数组。其中,first.toArraysecond.toArray 会为您进行转换。