簡體   English   中英

如何編寫ArrayList <Object> 到csv文件

[英]How to write ArrayList<Object> to a csv file

我有一個ArrayList<Metadata> ,我想知道是否有一個用於處理CSV文件的Java API,它有一個write方法,它接受一個類似於.Net中LinqToCsv的參數ArrayList <>。 據我所知, OpenCSV可用,但CsvWriter類不接受集合。 我的元數據類是

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,那么使用傳統的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);
}

通過使用CSVWriter ,您可以將ArrayList轉換為數組,並將其傳遞給writer。

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

如果您有一個對象的ArrayList(在您的情況下是元數據),您將使用BeanToCSV而不是CSVWriter。

您可以在opencsv源代碼中查看BeanToCSVTest,以獲取如何使用它的示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM