【问题标题】:Java: Using InputStream and Apache Commons CSV without line numbersJava:使用不带行号的 InputStream 和 Apache Commons CSV
【发布时间】:2021-01-06 20:16:31
【问题描述】:

这可能非常简单,但我一直无法找到执行此操作的选项。我正在尝试使用 Apache Commons CSV 读取文件以供以后验证。有问题的 CSV 作为输入流提交,它似乎在读取文件时向文件添加了一个附加列,其中包含行号。如果可能的话,我希望能够忽略它,因为标题行不包含数字,这会导致错误。 InputStream 中是否已经有一个选项可以执行此操作,还是我必须设置某种后处理?

我使用的代码如下:

public String validateFile(InputStream filePath) throws Exception{
        System.out.println("Sending file to reader");
        System.out.println(filePath);
        InputStreamReader in = new InputStreamReader(filePath);
        //CSVFormat parse needs a reader object
        System.out.println("sending reader to CSV parse");
        for (CSVRecord record : CSVFormat.DEFAULT.withHeader().parse(in)) {
            for (String field : record) {
                System.out.print("\"" + field + "\", ");
            }
            System.out.println();
        }
        return null;
    }

当使用withHeader() 时,我最终得到以下错误:

java.lang.IllegalArgumentException: A header name is missing in [, Employee_ID, Department, Email]

我不能简单地跳过它,因为我需要对标题行进行一些验证。

另外,这里是一个示例 CSV 文件:

"Employee_ID", "Department", "Email"
"0123456","Department of Hello World","John.Doe@gmail.com"

编辑:另外,最终目标是验证以下内容:

  1. 存在名为“Employee_ID”、“Department”和“Email”的列。为此,我想我需要删除 .withHeader()。
  2. 每行以逗号分隔。
  3. 没有空单元格值

【问题讨论】:

  • XY problem: 为什么不直接在CSVFormat 上致电withAllowMissingColumnNames()
  • @Andreas 我没有看到 Apache Commons CSV 文档的那部分内容。不过,这修复了错误,一旦我用它替换了 withHeader(),它似乎会通读文件。我假设我需要指定列以忽略行号(例如:employee=row[1]、dept=row[2] 等)。这是正确的,还是我错过了更有效的解决方案?
  • 1) 如果你想要withHeader(),为什么要删除它? --- 2) 那是validateFile() 应该验证吗?我认为它不应该打印。这只是调试信息,现在,对吧?那么该方法究竟应该验证什么?我会假设它应该验证该文件是 CSV,并且它包含所需的列。为此,您需要列标题和这些列的值,但您不关心其他列,对吗?所以你不关心 unnamed 行号列,对吧?你真的不关心列顺序。

标签: java csv inputstream apache-commons-csv


【解决方案1】:

较新版本的 Commons-CSV 存在空标题问题。 也许这里也是这种情况? 您刚刚提到“没有空单元格值”不确定这是否也包括标题...

另见:https://issues.apache.org/jira/browse/CSV-257

设置 .setAllowMissingColumnNames(true) 对我有用。

final CSVFormat csvFormat = CSVFormat.Builder.create()
        .setHeader(HEADERS)
        .setAllowMissingColumnNames(true)
        .build();
final Iterable<CSVRecord> records = csvFormat.parse(reader);

【讨论】:

    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2018-08-27
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多