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

时间:2016-01-28 09:23:36

标签: java csv arraylist opencsv

我有一个ArrayList<Metadata>,我想知道是否有一个用于处理CSV文件的Java API,它有一个接受ArrayList&lt;&gt;的write方法。作为类似于.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文件。 请建议。

3 个答案:

答案 0 :(得分:10)

肯定会有一堆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,那么使用传统的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);
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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