gpt4 book ai didi

java - 无法使用 Apache Commons CSV 解析 CSV 文件中的最后一列

转载 作者:行者123 更新时间:2023-12-02 09:27:20 27 4
gpt4 key购买 nike

我有一个 CSV 文件,其中有 19 列(最后一列为空)。我正在通过 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 列)包含在 toString() 方法的输出中mapping 部分(但不在 values 部分)。

但是,当我通过以下代码将 csvRecord 转换为 map 时:

Map<String, String> csvRecordMap = csvRecord.toMap();

最后一列不再存在。当我执行时:

if (csvRecordMap.containsKey("TN")) 

返回 false。

根据我的测试,我注意到,如果 toMap() 方法后面没有非空列,则它不会包含空列(即使列实际上存在于 CSV 文件中)。如果某列为空,但其后有非空列,则该列将包含在 toMap() 方法的返回值中。

如何强制解析器返回所有列 - 通过 toMap() 方法或以某种方式直接从 csvRecord 中提取它,因为它明显存在,如图所示toString() 方法?

谢谢!

最佳答案

循环并添加缺少的名称:

Map<String, String> map = csvRecord.toMap();
for (String name : csvParser.getHeaderNames())
map.putIfAbsent(name, "");

演示

CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader();
try (CSVParser csvParser = csvFormat.parse(Files.newBufferedReader(Paths.get("test.txt")))) {
System.out.println(csvParser.getHeaderNames());
for (CSVRecord csvRecord : csvParser) {
System.out.println(csvRecord);
System.out.println(" toMap(): " + csvRecord.toMap());

Map<String, String> map = csvRecord.toMap();
for (String name : csvParser.getHeaderNames())
map.putIfAbsent(name, "");
System.out.println(" fixed : " + map);
}
}

test.txt

A,B,C,D
1,2,3,4
1,2,3
1,2
1
1,
1,,
1,,,
,,,4,,,

输出(带有 commons-csv-1.7.jar)

[A, B, C, D]
CSVRecord [comment='null', recordNumber=1, values=[1, 2, 3, 4]]
toMap(): {A=1, B=2, C=3, D=4}
fixed : {A=1, B=2, C=3, D=4}
CSVRecord [comment='null', recordNumber=2, values=[1, 2, 3]]
toMap(): {A=1, B=2, C=3}
fixed : {A=1, B=2, C=3, D=}
CSVRecord [comment='null', recordNumber=3, values=[1, 2]]
toMap(): {A=1, B=2}
fixed : {A=1, B=2, C=, D=}
CSVRecord [comment='null', recordNumber=4, values=[1]]
toMap(): {A=1}
fixed : {A=1, B=, C=, D=}
CSVRecord [comment='null', recordNumber=5, values=[1, ]]
toMap(): {A=1, B=}
fixed : {A=1, B=, C=, D=}
CSVRecord [comment='null', recordNumber=6, values=[1, , ]]
toMap(): {A=1, B=, C=}
fixed : {A=1, B=, C=, D=}
CSVRecord [comment='null', recordNumber=7, values=[1, , , ]]
toMap(): {A=1, B=, C=, D=}
fixed : {A=1, B=, C=, D=}
CSVRecord [comment='null', recordNumber=8, values=[, , , 4, , , ]]
toMap(): {A=, B=, C=, D=4}
fixed : {A=, B=, C=, D=4}

关于java - 无法使用 Apache Commons CSV 解析 CSV 文件中的最后一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58254689/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com