Univocity CSV解析器会粘合整行,如果它以引号“

nxowjjhe  于 2022-12-15  发布在  其他
关注(0)|答案(1)|浏览(127)

我正在使用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);
mnowg1ta

mnowg1ta1#

此处为库的作者。您在此处输入的内容是格式正确的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);
}

希望这个有用。

相关问题