我正在读取来自远程源的非常大(数百万行)的CSV文件,而我无法控制。我正在使用OpenCSV,它工作得很好,直到今天。今天的文件中只有一条坏线,看起来像
col1,col2,col3,"col4, ""stuff"" and yeah, \", col5, col6, col7...\r\n
额外的\结尾打破OpenCsv,以便readNext永远不会返回。我怀疑它是作为一个转义引用,并且引用的字段没有关闭。如果我删除\一切都很好。把它放回去,它再次破裂。
由于readNext永远不会返回,因此我没有很好的方法来捕获错误并拦截它。
我的猜测是它试图将整个文件的其余部分(数千行中的100个)加载到col4并阻塞。
我更喜欢的是一个错误,我可以捕获,报告并转到文件中的下一行。知道我怎么能做到这一点吗?
答案 0 :(得分:1)
好的 - 我想出了办法。最初我用的是:
reader = new CSVReader(new FileReader(this.fullFileName), ',','"', 1);
然后有一个像这样的循环:
while ((csvLine = reader.readNext()) != null) {
..do stuff..
}
对readNext()的调用在遇到错误记录时永远不会返回。所以没有办法抓住它。更改代码以改为使用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将抛出异常,我可以捕获并执行操作。
这样做的主要缺点是多行记录不起作用,但在我的用例中不是问题。我不知道多线记录的解决方案。