请问我在使用 Java 读取 csv 文件时遇到问题。 我用来读取csv文件的java代码是:
package collectData;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.nio.charset.Charset;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
public class testCSV {
public static void main(String[] args) throws IOException {
String csvFilePath = "csv_files\\20240403_OV64E_A.csv";
Charset encoding = Charset.forName("ISO-8859-1");
try (Reader in = new FileReader(csvFilePath, encoding);
CSVParser parser = CSVFormat.DEFAULT.withHeader().withDelimiter(';').parse(in)) {
for (CSVRecord record : parser) {
for (String headerName : parser.getHeaderNames()) {
System.out.print(headerName + ": " + record.get(headerName) +" ");
}
System.out.println();
}
}
}
}
当我尝试读取下载的文件时,我收到此错误消息:
Exception in thread "main" java.lang.IllegalArgumentException: A header name is missing in [Ref file, Version file, state file, App name, App version, APPS Classification, Apps release date, Data ref, Data version, DATA Classification, ]
at org.apache.commons.csv.CSVParser.createHeaders(CSVParser.java:509)
at org.apache.commons.csv.CSVParser.<init>(CSVParser.java:438)
at org.apache.commons.csv.CSVParser.<init>(CSVParser.java:404)
at org.apache.commons.csv.CSVFormat.parse(CSVFormat.java:1781)
at collecteRCD.testCSV.main(testCSV.java:28)
但是当我打开 csv 文件并保存它而不修改任何内容时;该程序运行完美。
我尝试在保存文件之前和之后使用文本编辑器读取该文件,这就是变化:
之前:
Ref file;Version file;state file;App name;App version;APPS Classification;Apps release date;Data ref;Data version;DATA Classification;
003298;4.1;Figée;;;;;
003798;6.1;Figée;;;;;
之后:
Ref file;Version file;state file;App name;App version;APPS Classification;Apps release date;Data ref;Data version;DATA Classification
3298;4.1;Figée;;;;;;;;
3798;6.1;Figée;;;;;;;;
请,我需要知道一种自动更正 csv 文件的方法,因为我正在尝试构建一个自动化应用程序,并且通过打开并保存文件来手动更正文件是没有意义的。
我在网上寻找一些解决方案,但一无所获。
您面临的问题是因为下载的 CSV 文件开头可能有一个字节顺序标记 (BOM),这导致解析将第一行(包含标题)视为在开头有一个空字段开始。这会导致 Apache Commons CSV 中的标头解析逻辑失效。
如果您下载的文件始终带有 BOM 标记,您可以以编程方式将其保存为 UTF-8,或者更好的是在解析过程中跳过第一个,方法是
parser.nextRecord();
原始csv文件缺少标题;内容只有 8 个字段,但有 11 个标题。
您需要进行以下更改:
以下csv可以正常读取(我测试过):
Ref file;Version file;state file;App name;App version;APPS Classification;Apps release date;Data ref;Data version;DATA Classification;A Header
003298;4.1;Figée;;;;;;;;
003798;6.1;Figée;;;;;;;;