2010-09-02 108 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