我有一个csv文件,其中每个字段(列标题除外)都有一个双引号文本限定符:field:"some value"
。但是,文件中的某些字段在值中带有双引号。 field2:"25" TV"
或field3:"25" x 14" x 2""
或field4:"A"bcd"ef"g"
。 (我认为你说对了)。如果我具有字段2-4中的数据,我的Java文件处理将失败,因为我指定了双引号是字段上的文本限定符,并且看起来该行的字段过多。如何执行以下任一或所有操作:
我对此文件的控制级别是什么?该文件按原样提供,但我只需要文件中两个不同列中的数据。我可以做任何我需要做的事情来获取数据。
答案 0 :(得分:1)
首先,如果确实是CSV文件,则应使用逗号将每一行分成几列。
一旦将其分成几列,如果我们确定该值应以双引号(“)开头和结尾,我们可以简单地删除所有双引号,然后在开头和之后重新应用结束。
String input = "\"hello\",\"goodbye Java \"the best\" language\", \"this is really \"\"\"bad\"";
String[] parsed = input.split(",");
String[] clean = new String[parsed.length];
int index = 0;
for (String value : parsed) {
clean[index] = "\"" + value.replace("\"", "") + "\"";
index++;
}
如果值中可能包含逗号,则应改用以下内容
String input = "\"hello\",\"goodbye,\" Java \"the best\" language\", \"this is really \"\"\"bad\"";
String[] parsed = input.split("\"\\s*,\\s*\"");
String[] clean = new String[parsed.length];
int index = 0;
for (String value : parsed) {
clean[index] = "\"" + value.replace("\"", "") + "\"";
index++;
}
}
请注意,如果值中存在\“ \ s *,\ s * \”的序列,则记录将是不明确的。例如,如果它是一个两列文件,则输入记录 “ abc”,“ def”,“ ghi”可以是
值1 =“ abc”,“ def”值2 =“ ghi” 要么 值1 =“ abc”值2 =“ def”,“ ghi”
答案 1 :(得分:0)
请注意,许多CSV实现都会将双引号转义为两个连续的引号。
所以14
可能(应该吗?)是您的输入。
答案 2 :(得分:0)
假定逗号是列分隔符,并且每一列都用双引号引起来:
String[] columns = input.split("\",\"");
if (columns.length > 0) {
columns[0] = columns[0].substring(1);
String lastColumn = columns[columns.length-1];
columns[columns.length-1] = lastColumn.substring(0,lastColumn.length()-1);
}
这些列仍将使用内部双引号。如果您不想要它们,可以将它们替换掉。