我想从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或仅使用正则表达式的情况下实现?谁能给我一个想法或例子?
答案 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();
}