Java修改csv行

时间:2014-12-12 00:44:15

标签: java regex csv

我想从csv文件中删除第2和第3列但不知道如何操作。我目前的代码是这样的:

BufferedReader br = new BufferedReader(new FileReader(dir + file));
BufferedWriter bw = new BufferedWriter(new FileWriter(target + file));

String perLine;
while ((perLine = br.readLine()) != null) {

    Code to remove the 2nd and 3rd column...

    bw.write(perLine)
}
br.close();
bw.close();

数据是这样的:

1,abc,2,def,data,data,1,2,3,4,5
2,wxyz,32,abc,data,data,1,2,3,4,5

希望实现这一目标:

1,def,data,data,1,2,3,4,5
2,abc,data,data,1,2,3,4,5

这是否可以在不添加任何csv lib或仅使用正则表达式的情况下实现?谁能给我一个想法或例子?

3 个答案:

答案 0 :(得分:3)

只要你采用" CSV是逗号和#34之间的字段的行,这很简单。做法。问题在于CSV实际上比这更复杂;当你考虑到可以引用的东西时,引号可以被转义,引用的字段可以包含换行符...然后使用正则表达式不容易解析。因此,每当您需要支持标准CSV时(例如,如RFC4180中所指定的那样),您真的非常想使用库,而不是自己制作解决方案。

那说......

您无法更改当前文件。这样做的方法是读取文件,更改内容,然后将其写回,或者在读取文件时写入另一个(临时)文件,然后切换。

关于删除第2和第3列的部分,采用天真的方法:

String fields[] = perLine.split(",");
String newFields[] = new String[fields.length - 2];
newFields[0] = fields[0];
System.arrayCopy(fields, 3, newFields, 1, fields.length - 1);

答案 1 :(得分:1)

在处理RFC4180后面的CSV时,有很多细微差别。有些事情需要考虑,例如引用的字符串,转义的引用字符串,那些中的逗号,多行字段以及许多其他字符串。其中一些可以找到here

如果您可以假设数据只是“逗号之间”,而不是处理所有有效的CSV,则可以在,上拆分字符串并省略您不想要的索引。

以下是排除这些索引并使用Java 8的String.join形成输出字符串的示例:

String[] split = test.split(",");
String[] outputFields = new String[split.length - 2];
outputFields[0] = split[0];
System.arraycopy(split, 3, outputFields, 1, split.length - 3);

String result = String.join(",", outputFields);

答案 2 :(得分:0)

使用opencsv

 CSVWriter writer = null;
    try {
        //Read file here.... 
        String str = "1,abc,2,def,data,data,1,2,3,4,5"; 
        writer = new CSVWriter(new FileWriter("test.csv"),',',CSVWriter.NO_QUOTE_CHARACTER); 
        String strArr[] = str.split(","); 
        List<String> output = new ArrayList<>(); 
        for (int i = 0; i < strArr.length; i++) { 
        if (i == 1 || i == 2) {
            continue;
        } else {
            output.add(strArr[i] );
        }
    }
    if(!output.isEmpty()){
        String[] array = new String[output.size()];
        writer.writeNext(output.toArray(array));
    }
 } finally {
    if (writer != null)
        writer.close();
    }

CSVWriter writer = null; try { //Read file here.... String str = "1,abc,2,def,data,data,1,2,3,4,5"; writer = new CSVWriter(new FileWriter("test.csv"),',',CSVWriter.NO_QUOTE_CHARACTER); String strArr[] = str.split(","); List<String> output = new ArrayList<>(); for (int i = 0; i < strArr.length; i++) { if (i == 1 || i == 2) { continue; } else { output.add(strArr[i] ); } } if(!output.isEmpty()){ String[] array = new String[output.size()]; writer.writeNext(output.toArray(array)); } } finally { if (writer != null) writer.close(); }