【发布时间】:2019-10-06 15:52:25
【问题描述】:
我有一个包含 19 列的 CSV 文件(最后一列是空的)。我正在通过 Apache Commons CSV 解析文件。当我执行时:
System.out.println("csvRecord.toString() = " + csvRecord.toString());
我得到以下输出:
csvRecord.toString() = CSVRecord [comment=null, mapping={Amount=6, ID=2, UID=4, Address=5, Carrier=17, CPL=14, F=12, GC=13, PIT=9, PP=11, PCIT=10, PT=1, SPI=3, SPI1=8, ST=7, Status=16, SOI=0, TN=18, TP=15}, recordNumber=6, values=[FB, S13 Wood Carving, B07, AG, bis, FB, 44.8, PE, AG XXXXXXX47, UNKNOWN, 39.95, 1.6, 4.1, , -2.2068006148899633, -0.46425251802390777, COMPLETED, US]]
如您所见,最后一列 TN=18(实际上是从 1 计数时的第 19 列)包含在 mapping 部分的 toString() 方法的输出中(但不在 values 部分中) .
但是,当我通过以下代码将csvRecord 转换为映射时:
Map<String, String> csvRecordMap = csvRecord.toMap();
最后一列不再存在。当我执行时:
if (csvRecordMap.containsKey("TN"))
它返回 false。
根据我的测试,我注意到toMap() 方法不会包含一个空列,如果它后面没有 非空 列(即使该列实际上存在于 CSV 文件中)。如果一列是空的,但后面有非空列,那么它将包含在toMap()方法的返回值中。
如何强制解析器返回所有列——通过toMap() 方法或通过某种方式直接从csvRecord 中提取它,因为它显然存在于toString() 方法中?
谢谢!
【问题讨论】:
标签: java csv apache-commons