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

2022-09-04 19:49:46

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

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

一旦我填充了记录,我想把每一行都写到一个csv文件中。请建议。


答案 1

当然,会有一堆API可以为您做到这一点,但是为什么不自己做这么简单的案例呢?它将为您节省依赖项,这对于任何规模的任何项目来说都是一件好事。

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

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

答案 2

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

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