当行缺少引号时 OpenCSV 无限循环
OpenCSV infinte loop when line has missing quote
我正在读取来自我无法控制的远程源的非常大(数百万行)的 CSV 文件。直到今天,我一直在使用 OpenCSV,它运行良好。今天的文件中有一行坏行,看起来像
col1,col2,col3,"col4, ""stuff"" and yeah, \", col5, col6, col7...\r\n
最后的额外 \ 破坏了 OpenCsv,因此 readNext 永远不会 returns。我怀疑它是将其视为转义引号,并且引号字段未关闭。如果我删除 \ 一切都很好。放回去,又坏了。
因为 readNext 从来没有 returns 我没有一个很好的方法来捕获错误并拦截它。
我的 猜测 是它试图将文件的整个其余部分(数千行的数百行)加载到 col4 中并阻塞。
我更喜欢的是我可以捕获、报告并移至文件中的下一行的错误。知道我该怎么做吗?
好的 - 我想出了一个办法。最初我使用的是:
reader = new CSVReader(new FileReader(this.fullFileName), ',','"', 1);
然后有一个像这样的循环:
while ((csvLine = reader.readNext()) != null) {
..do stuff..
}
对 readNext() 的调用永远不会 returns 当它遇到那个坏记录时。所以没有办法抓住它。更改代码以改用 CVSParser:
fileLines = Files.readAllLines(new File(this.fullFileName).toPath(), Charset.forName("UTF-8"));
CSVParser csvParser = new CSVParser(delimChar,quoteChar);
for (String nextLine : fileLines) {
try {
csvLine = csvParser.parseLine(nextLine);
...do stuff...
} catch (Exception ex) {
...report bad record and stuff..
}
}
现在,当命中该记录时,CSVParser 将抛出一个异常,我可以捕获并处理该异常。
这样做的主要缺点是多行记录不起作用,但在我的用例中这不是问题。我不知道多行记录的解决方案。
我正在读取来自我无法控制的远程源的非常大(数百万行)的 CSV 文件。直到今天,我一直在使用 OpenCSV,它运行良好。今天的文件中有一行坏行,看起来像
col1,col2,col3,"col4, ""stuff"" and yeah, \", col5, col6, col7...\r\n
最后的额外 \ 破坏了 OpenCsv,因此 readNext 永远不会 returns。我怀疑它是将其视为转义引号,并且引号字段未关闭。如果我删除 \ 一切都很好。放回去,又坏了。
因为 readNext 从来没有 returns 我没有一个很好的方法来捕获错误并拦截它。
我的 猜测 是它试图将文件的整个其余部分(数千行的数百行)加载到 col4 中并阻塞。
我更喜欢的是我可以捕获、报告并移至文件中的下一行的错误。知道我该怎么做吗?
好的 - 我想出了一个办法。最初我使用的是:
reader = new CSVReader(new FileReader(this.fullFileName), ',','"', 1);
然后有一个像这样的循环:
while ((csvLine = reader.readNext()) != null) {
..do stuff..
}
对 readNext() 的调用永远不会 returns 当它遇到那个坏记录时。所以没有办法抓住它。更改代码以改用 CVSParser:
fileLines = Files.readAllLines(new File(this.fullFileName).toPath(), Charset.forName("UTF-8"));
CSVParser csvParser = new CSVParser(delimChar,quoteChar);
for (String nextLine : fileLines) {
try {
csvLine = csvParser.parseLine(nextLine);
...do stuff...
} catch (Exception ex) {
...report bad record and stuff..
}
}
现在,当命中该记录时,CSVParser 将抛出一个异常,我可以捕获并处理该异常。
这样做的主要缺点是多行记录不起作用,但在我的用例中这不是问题。我不知道多行记录的解决方案。