首页 > 解决方案 > Univocity CSV 解析器会粘合整行,如果它以引号开头“

问题描述

univocity 2.7.5用来解析csv文件。到目前为止,它工作正常并将csv文件中的一行解析为带有元素的字符串数组n,其中 n = 一行中的列数。但是现在我有一个文件,其中行以引号开头",解析器无法处理它。它返回一行作为字符串数组,其中只有一个元素包含整行数据。我试图从csv文件中删除该引用并且它工作正常,但大约有 500,000 行。我应该怎么做才能让它工作?

这是我文件中的示例行(源文件中也有引号)

 "100926653937,Kasym Amina,620414400630,Marzhan Erbolova,""Kazakhstan, Almaty, 66, 3"",87029845662"

这是我的代码:

    CsvParserSettings settings = new CsvParserSettings();
    settings.setDelimiterDetectionEnabled(true);
    CsvParser parser = new CsvParser(settings);
    List<String[]> rows = parser.parseAll(csvFile);

标签: javacsvparsingunivocity

解决方案


图书馆的作者在这里。您在那里的输入是格式正确的 CSV,其中包含一个值:

100926653937,Kasym Amina,620414400630,Marzhan Erbolova,"Kazakhstan, Almaty, 66, 3",87029845662

如果该行出现在您输入的中间,我想您的输入有未转义的引号(在您到达该行之前的某个位置)。尝试使用未转义的报价处理设置:

例如,这可能有效:

settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE);

如果没有任何效果,并且您的所有行看起来都像您发布的行,那么您可以解析输入两次(这很糟糕而且很慢,但会起作用):

CsvParser parser = new CsvParser(settings);
parser.beginParsing(csvFile);

List<String[]> out = new ArrayList<>();
String[] row;
while ((row = parser.parseNext()) != null) {
    //got a row with unexpected length?
    if(row.length == 1){
        //break it down again.
        row = parser.parseLine(row[0]);
    }
    out.add(row);
}

希望这可以帮助。


推荐阅读