java - 如果整行以引号 "开头,Univocity CSV 解析器会粘合整行

标签 java csv parsing univocity

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

最佳答案

这里是该库的作者。您的输入是一个格式良好的 CSV,其中单个值包括:

100926653937,Kasym Amina,620414400630,Marzhan Erbolova,"哈萨克斯坦, 阿拉木图, 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);
}

希望这有帮助。

关于java - 如果整行以引号 "开头,Univocity CSV 解析器会粘合整行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53169596/

相关文章:

java - java中查找双引号内的子字符串

java - Struts2 FilterDispatcher 和 StrutsPrepareAndExecuteFilter 有什么区别?

java - 将时间和日期转换为相对时间(CSV 处理)

csv - 用包含字符串的定界符将 csv 文件中的列值替换为 (g)awk

java - 如何保存到局部变量并在短路操作数中运行函数?

java - SpringData JPA native 查询提供 java.sql 数据而不是 LocalDate

java - 使用azure运行java应用程序但访问不工作

python - 如何使用 python 选择特定的 CSV 行

parsing - 如何将 instaparse 输出转换为可以评估的函数?

.net - 正则表达式帮助,解析为 NameValueCollection