java - 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);
解决方案
图书馆的作者在这里。您在那里的输入是格式正确的 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);
}
希望这可以帮助。
推荐阅读
- php - Laravel DataTables 下拉过滤器不起作用
- javascript - 为什么通过单击跨度,它的文本不会被扔到输入中?javascript, jQuery
- sqlite - 按两列之和对 SQLite 表进行排序
- node.js - NodeJs、Multer 和 FFMPEG,试图在文件转换和下载方面取得进展
- node.js - Express/node/ejs/mongoose 应用程序中的 UnhandledPromiseRejectionWarning
- ssis - SSIS问题
用于带有 Power Shell 空间的路径 - c++ - 如何在不与 kernel32 链接的情况下编译 C++ 代码?
- javascript - Javascript中有没有一种方法可以根据用户的输入过滤产品列表并删除该项目而不将其从我的数据库中删除?
- python - “无效的日期时间格式”使用 .read_sql() 读取 MS Access 日期/时间值
- javascript - JavaScript 对象:无法向对象添加新属性