2016-04-24 99 views
-1

如果我有一個文件(如csv,txt ...)。如何讀取文件和拆分scala

enter image description here

我希望得到兩個數組如

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) 

是什麼在斯卡拉做到這一點的理想方式?

+0

做什麼?你想對數據做什麼? –

+0

我想讀取csv或txt文件並拆分這些數據。 我希望得到像上面那樣的兩個數組。 –

+1

如果你沒有絲毫的努力去解決這個問題,那麼提出「如何做X」這樣的問題(至少)是一種不好的滋味。這不是「做我的家免費工作」網站,而是「幫助我變得更加擅長我的工作」資源。 – Dima

回答

1

@Vitaliy Kotlyarenko的答案,但沒有使用第三方像星火類似(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)) 
1
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) 
+1

我在OP的問題中沒有看到Spark? –

+0

oops,當您有2個瀏覽器選項卡打開spark和scala標記時,會發生這種情況。 –

1

你可以在兩個數組一個去,這樣你就不需要遍歷數據兩次:

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將爲你做轉換。

+0

你的代碼不會編譯 –

+0

是的,認爲它僞代碼:)我從我的手機發布,所以...警告虛空。此外,我並不認爲完整的工作代碼是對這樣的問題的答案,而海報顯然只是在尋找一種讓他人爲他們工作的方式。所以,也許,我犯的一些錯別字是最好的。我希望,儘管我概述了這個意圖和一般的方法。 @Łukasz – Dima

+0

好吧,我更新了代碼供您編譯,希望您不介意。 –