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

时间:2016-09-15 18:08:50

标签: java csv opencsv apache-commons-csv

示例数据 -

Header1,full_name,header3,header4

  1. 20,“bob,XXX”,“test”,30
  2. 20,“evan”,YYY“,”test“,30
  3. 20,“Tom,ZZZ”,“test”,30

    CSVReader csvReader = new CSVReader(reader, ',', '"');
    
  4. 第二行未按预期读取。因为full_name列值中有双引号。

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

    使用openCSV java api进行解析。

    编辑:

    我从数据库中获取数据。其中一个数据库列字段中有一个双引号值。因此,csv数据看起来格格不入。

1 个答案:

答案 0 :(得分:1)

univocity-parsers可以处理未转义的引号,也比opencsv快4倍。试试这段代码:

public static void main(String... args){
    String input = "" +
            "20, \"bob, XXX\", \"test\", 30\n" +
            "20, \"evan\"s,YYY \", \"test\", 30\n" +
            "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许可证)