使用CSV解析器解析CSV文件时,忽略字段中的双引号



样本数据-

Header1, full_name, header3, header4

  1. 20, "bob, XXX", "test", 30
  2. 20, "evan"s,YYY ", "test", 30
  3. 20, "Tom, ZZZ", "test", 30

    CSVReader csvReader = new CSVReader(reader, ',', '"');
    

第二行读取不符合预期。因为在full_name列值中有双引号

我想忽略这种情况。任何建议都将不胜感激。

使用openCSV java api进行解析。

编辑:

我正在从数据库中获取数据。其中一个数据库列字段的值中有一个双引号。因此,csv数据看起来是畸形的。

univocityparser可以处理未转义的引号,并且比opencsv快4倍。试试下面的代码:

public static void main(String... args){
    String input = "" +
            "20, "bob, XXX", "test", 30n" +
            "20, "evan"s,YYY ", "test", 30n" +
            "20, "Tom, ZZZ", "test", 30 ";

    CsvParserSettings settings = new CsvParserSettings();
    CsvParser parser = new CsvParser(settings);
    List<String[]> rows = parser.parseAll(new StringReader(input));
    //printing values enclosed in [ ]  to make sure you are getting the expected result
    for(String[] row : rows){
        for(String value : row){
            System.out.print("[" + value + "],");
        }
        System.out.println();
    }
}

这将产生:

[20],[bob, XXX],[test],[30],
[20],["evan"s],[YYY "],[test],[30],
[20],[Tom, ZZZ],[test],[30],

另外,您可以使用

之一来控制如何处理未转义的引号:
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_DELIMITER);
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE);
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.RAISE_ERROR);
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.SKIP_VALUE);

当读取大文件时,您可以使用RowProcessor或像这样遍历每一行:

parser.beginParsing(new File("/path/to/your.csv"));
String[] row;
while ((row = parser.parseNext()) != null) {
    // process row
}

免责声明:我是这个库的作者。它是开源和免费的(Apache 2.0许可)

相关内容

  • 没有找到相关文章

最新更新