使用JAVA读取.CSV文件时出现问题

问题描述 投票:0回答:2

请问我在使用 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 文件的方法,因为我正在尝试构建一个自动化应用程序,并且通过打开并保存文件来手动更正文件是没有意义的。

我在网上寻找一些解决方案,但一无所获。

java csv apache-commons read-csv
2个回答
0
投票

您面临的问题是因为下载的 CSV 文件开头可能有一个字节顺序标记 (BOM),这导致解析将第一行(包含标题)视为在开头有一个空字段开始。这会导致 Apache Commons CSV 中的标头解析逻辑失效。

如果您下载的文件始终带有 BOM 标记,您可以以编程方式将其保存为 UTF-8,或者更好的是在解析过程中跳过第一个,方法是

parser.nextRecord();


0
投票

原始csv文件缺少标题;内容只有 8 个字段,但有 11 个标题。

您需要进行以下更改:

  1. 添加标题;
  2. 将缺失的字段添加到内容中,直到达到 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;;;;;;;;
© www.soinside.com 2019 - 2024. All rights reserved.