当行缺少报价时,OpenCSV infinte循环

时间:2017-03-21 18:04:07

标签: java opencsv

我正在读取来自远程源的非常大(数百万行)的CSV文件,而我无法控制。我正在使用OpenCSV,它工作得很好,直到今天。今天的文件中只有一条坏线,看起来像

col1,col2,col3,"col4, ""stuff"" and yeah, \", col5, col6, col7...\r\n

额外的\结尾打破OpenCsv,以便readNext永远不会返回。我怀疑它是作为一个转义引用,并且引用的字段没有关闭。如果我删除\一切都很好。把它放回去,它再次破裂。

由于readNext永远不会返回,因此我没有很好的方法来捕获错误并拦截它。

我的猜测是它试图将整个文件的其余部分(数千行中的100个)加载到col4并阻塞。

我更喜欢的是一个错误,我可以捕获,报告并转到文件中的下一行。知道我怎么能做到这一点吗?

1 个答案:

答案 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将抛出异常,我可以捕获并执行操作。

这样做的主要缺点是多行记录不起作用,但在我的用例中不是问题。我不知道多线记录的解决方案。