Java如何删除双引号文本限定符之间的双引号字符

时间:2019-06-04 20:40:54

标签: java csv

我有一个csv文件,其中每个字段(列标题除外)都有一个双引号文本限定符:field:"some value"。但是,文件中的某些字段在值中带有双引号。 field2:"25" TV"或field3:"25" x 14" x 2""或field4:"A"bcd"ef"g"。 (我认为你说对了)。如果我具有字段2-4中的数据,我的Java文件处理将失败,因为我指定了双引号是字段上的文本限定符,并且看起来该行的字段过多。如何执行以下任一或所有操作:

  • 从字段内部删除双引号字符
  • 将双引号字符替换为另一个值
  • 在字段中使我的Java进程“忽略”或“跳过”双引号。

我对此文件的控制级别是什么?该文件按原样提供,但我只需要文件中两个不同列中的数据。我可以做任何我需要做的事情来获取数据。

3 个答案:

答案 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);
}

这些列仍将使用内部双引号。如果您不想要它们,可以将它们替换掉。