根据Java中的字段拆分csv

时间:2013-09-02 13:20:03

标签: java linux csv split

我想根据最后一个“字段”拆分csv文件。 例如,csv文件包含:

a,1
b,2
c,3
d,1

数字表示类别。

此文件应根据编号(分别为类别)拆分为单独的文件,以便存在三个文件。

第一个文件:

a,1
d,1

第二档:

b,2

第三档:

c,3

贪婪的方法是读取每行的csv,将字符串拆分为“,”并分隔最后一个元素(这里是数字)。之后我可以检查当前行的编号并将其放入FileWriter中。 但是:我不知道会有多少类别,因为我希望保持系统的可扩展性。因此,所需的FileWrite的数量是未知的。

作为替代方案,我可以阅读每个类别的完整csv文件。在第一次迭代中,只处理类别“1”的行并写入“1.csv”,在第二步中只有类别“2”的行进入“2.csv”,依此类推。 但是:这意味着文件必须被读取的次数与存在的类别一样多,这可能很常见。

你知道为此目的是否有一个优雅的解决方案?

我也很欣赏基于linux的解决方案!也许没有必要创建一个Java程序? 我想awk可能是首选工具吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

试试这个awk单行:

awk -F, '{print >> "output"$NF".csv"}' input.csv

它将读取每一行并根据该行的最后一个字段的值将其写入相应的输出csv文件。

答案 1 :(得分:2)

我会采用更通用的方式。在这种情况下,我不需要知道第二列中的所有项目,因此这是自动的:

total.csv

a,1
b,2
c,3
d,1

script.sh

#!/bin/bash

for line in $(cat total.csv)          
do          
   filename=$(echo $line | awk -F "," '{print $2}')
   echo $line >> $filename.csv 
done

输出:1.csv 2.csv 3.csv