我有一个 37 列的 CSV 文件,我正在使用 Apache Commons CSV 1.2 在 Java 中解析该文件。我的设置代码如下:
//initialize FileReader object
FileReader fileReader = new FileReader(file);
//intialize CSVFormat object
CSVFormat csvFileFormat = CSVFormat.DEFAULT.withHeader(FILE_HEADER_MAPPING);
//initialize CSVParser object
CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);
//Get a list of CSV file records
List<CSVRecord> csvRecords = csvFileParser.getRecords();
// process accordingly
我的问题是,当我将要处理的 CSV 复制到目标目录并运行解析程序时,出现以下错误:
Exception in thread "main" java.lang.IllegalArgumentException: Index for header 'Title' is 7 but CSVRecord only has 6 values!
at org.apache.commons.csv.CSVRecord.get(CSVRecord.java:110)
at launcher.QualysImport.createQualysRecords(Unknown Source)
at launcher.QualysImport.importQualysRecords(Unknown Source)
at launcher.Main.main(Unknown Source)
但是,如果我将文件复制到目标目录,打开并保存它,然后再次尝试该程序,它就可以工作。打开并保存 CSV 会在末尾添加所需的逗号,这样我的程序就不会因为没有足够的标头可供读取而抱怨。
对于上下文,这里是保存之前/之后的示例行:
之前(失败):“数据”,“数据”,“数据”,“数据”
之后(工作):“数据”,“数据”,,,,“数据”,,,“数据”,,,,,,
所以我的问题是:为什么当我打开并保存 CSV 格式时它会发生变化?我没有更改任何值或编码,保存时的行为与 MS-DOS 或常规 .csv 格式相同。另外,我在测试中使用 Excel 进行复制/打开/保存。
我需要使用一些编码或格式设置吗?我可以通过编程解决这个问题吗?
提前致谢!
EDIT #1:
对于其他上下文,当我第一次查看原始文件中的空行时,它只有新行 ^M 字符,如下所示:
^M
在 Excel 中打开并保存后,它看起来像这样,其中包含所有 37 个空字段:
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,^M
这是 Windows 编码差异吗?