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()
获得 - 作为 List
或 Iterable
。
其实方法不止一个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()
.
另见
- Java 开发者中心:Read CSV files using Apache Commons CSV,教程
我已经使用 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()
获得 - 作为 List
或 Iterable
。
其实方法不止一个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()
.
另见
- Java 开发者中心:Read CSV files using Apache Commons CSV,教程