【问题标题】:How to write ArrayList<Object> to a csv file如何将 ArrayList<Object> 写入 csv 文件
【发布时间】:2016-05-05 14:10:33
【问题描述】:

我有一个ArrayList&lt;Metadata&gt;,我想知道是否有一个用于处理 CSV 文件的 Java API,该 API 有一个接受 ArrayList 作为参数的写入方法,类似于 .Net 中的 LinqToCsv。据我所知 OpenCSV 可用,但 CsvWriter 类不接受集合。 我的元数据类是

public class Metadata{
    private String page;
    private String document;
    private String loan;
    private String type;
}
ArrayList<Metadata> record = new ArrayList<Metadata>();

一旦我填充了记录,我想将每一行写入一个 csv 文件。 请提出建议。

【问题讨论】:

  • 为什么不呢。 javacsv 呢?

标签: java csv arraylist opencsv


【解决方案1】:

肯定会有一大堆 API 可以为您执行此操作,但为什么不为这么简单的情况自己做呢?它将为您节省一个依赖项,这对于任何规模的任何项目都是一件好事。

Metadata 中创建一个toCsvRow() 方法,用于连接以逗号分隔的字符串。

public String toCsvRow() {
    return Stream.of(page, document, loan, type)
            .map(value -> value.replaceAll("\"", "\"\""))
            .map(value -> Stream.of("\"", ",").anyMatch(value::contains) ? "\"" + value + "\"" : value)
            .collect(Collectors.joining(","));
}

为每个Metadata 对象收集此方法的结果,用新行分隔。

String recordAsCsv = record.stream()
        .map(Metadata::toCsvRow)
        .collect(Collectors.joining(System.getProperty("line.separator")));

编辑 如果您没有幸运地拥有 Java 8 和 Stream API 供您使用,这几乎与使用传统 List 一样简单。

public String toCsvRow() {
    String csvRow = "";
    for (String value : Arrays.asList(page, document, loan, type)) {
        String processed = value;
        if (value.contains("\"") || value.contains(",")) {
            processed = "\"" + value.replaceAll("\"", "\"\"") + "\"";
        }
        csvRow += "," + processed;
    }
    return csvRow.substring(1);
}

【讨论】:

  • 它创建一个任意数量的相同类型对象的stream。流是 Java 8 的新特性。
  • 好的,我绑定到 Java 7,这就是它无法识别 Stream.of() 的原因。是否有任何可能的方法可以在没有流的情况下执行此操作,即在 Java 7 上。
  • 当然,映射和收集流更好。查看更新的答案 - 您应该能够自己将每一行放在单独的行上。
【解决方案2】:

通过使用CSVWriter,您可以将ArrayList 转换为一个数组,并将其传递给编写器。

csvWriter.writeNext(record.toArray(new String[record.size()]));

【讨论】:

  • 这是一个 java.lang.ArrayStoreException
【解决方案3】:

如果您有对象的 ArrayList(在您的情况下为元数据),您将使用 BeanToCSV 而不是 CSVWriter。

您可以查看BeanToCSVTest in the opencsv source code 以了解如何使用它的示例。

【讨论】:

  • 通常,答案应该独立存在。你能添加一个小的代码示例类吗?链接的示例将近 500 行。
  • mmmmkay - BeanToCSVTest 中的 testWriteQuotes() 测试怎么样,该测试采用 testData arrayList 并将结果发送到提供的 Writer(对于测试用例,它是一个 StringWriter,以便我可以测试结果。抱歉,我并不是要表现得刻薄或讽刺,但我忙得不可开交,没有时间编写示例。大多数 openCSV 都有测试,尽管作为一个整体承认太多,无法用作示例,可以单独作为示例进行查看。将来我将尝试缩小范围以找到最能回答问题的特定测试。
猜你喜欢
  • 1970-01-01
  • 2021-03-07
  • 2020-11-22
  • 1970-01-01
  • 2014-02-04
  • 2017-09-02
  • 2020-05-10
  • 2019-09-02
  • 2018-03-21
相关资源
最近更新 更多