如何将 ArrayList<Object> 写入 csv 文件

How to write ArrayList<Object> to a csv file

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

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

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

肯定会有一大堆 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 供您使用,这几乎与使用传统列表一样简单。

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);
}

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

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

如果您有一个对象数组列表(在您的情况下是元数据),您将使用 BeanToCSV 而不是 CSVWriter。

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