CSVParser.getRecords() 产生零结果

CSVParser.getRecords() yields zero results

我已经使用 apache.commons.CSVParser 一段时间了,没有任何问题。我知道这听起来很傻,就像狗吃了我的作业一样,但是,在过去两天里,解析器突然没有产生任何记录。记录大小在调试器中显示为非零值,但从 CSVParser.getRecords() 返回的列表为零。我在其他地方读到访问列表的正确方法是调用 getRecords() 上的 size() 方法,我已经这样做了。 再次强调,代码运行良好。 我使用 commons:commons-csv:jar:1.5 一段时间后,它停止工作,我尝试升级到 1.9.0,但行为仍然相同

CSVParser records = CSVFormat.DEFAULT.withDelimiter(DELIMITER).withHeader(blah).
                  withFirstRecordAsHeader().
                  parse(fileReader);
log.info(“Size:”+records.getRecords()); //shows up as 125, say 
List<CSVRecord> recordList = records.getRecords();//0 size!

我写了一些测试代码来验证我的理智,这段代码工作正常

FileReader fReader = new FileReader("/tmp/tempexport.csv");
CSVParser records = 
           CSVFormat.DEFAULT.withDelimiter(DELIMITER).
             withHeader("").withFirstRecordAsHeader().parse(fReader);
File file = new File("/tmp/tempexport.csv");
System.out.println(Files.lines(file.toPath()).count());
for (CSVRecord record: records.getRecords()) {
            System.out.println(record.get(0)  + 
 "::"+record.get(1));

命名有点误导

(两者:您的变量及其 method-name)

解析器(即使是 class CSVParser)是 parser.

records 是一组记录,可以使用 parser.getRecords() 获得 - 作为 ListIterable

其实方法不止一个idempotentgetter。所以 getRecords() 应该重命名为 nextRecords() 语义准确️。

注意文档强调 getRecords()streaming 字符:

The returned content starts at the current parse-position in the stream.

总之,getRecords() 会在每次读取调用时推进 parse-position。一旦您读取记录以记录为 “Size:”+records.getRecords(),CSV 流中的位置就会前进,可能已经在 end-of-file (EOF)。

当您需要记录的大小或数量时,使用 header-names 作为近似值:parser.getHeaderNames().size().

另见