2010-09-02 114 views
3

在Scala 2.8中做文件IO的最佳方式是什麼?使用Scala來分割一個大的CSV文件

我想要做的就是將一個海量的CSV文件剪切成許多較小的文件,例如每個文件有1000行數據,並且每個文件保留標題。

回答

12

對於這樣的簡單任務,我會使用scala.io.Source。舉例如下:

val input = io.Source.fromFile("input.csv").getLines() 

if (input.hasNext) { 
    // assuming one header line 
    val header = List(input.next()) 

    for ((i, lines) <- Iterator.from(1) zip input.grouped(linesPerFile)) { 
    val out = createWriter(i) // Create a file for index i 
    (header.iterator ++ lines.iterator).foreach(out.println) 
    out.close 
    } 
} 
+0

太好了。強迫我學習'拉鍊'也是如此! – Pengin 2010-09-02 18:20:03

0

如果你沒有遇到一些CSV更惱人的角落案例,莫里茨的回答很好。一個相關的例子是CSV數據,其中一列是一個可能包含換行符的字符串:您不能依賴單行上的行,或者最終將一些行減半。

我會使用專用的CSV解析庫來將您的數據轉換爲迭代器。 kantan.csv就是一個例子(我是作者),但還有其他的選擇,如product-collectionsopencsv