web-dev-qa-db-ja.com

ArrayList <Object>をcsvファイルに書き込む方法

ArrayList<Metadata>があり、.NetのLinqToCsvと同様に、ArrayList <>をパラメーターとして受け入れる書き込みメソッドを持つCSVファイルを操作するためのJava APIがあるかどうかを知りたいです。私が知っているようにOpenCSVは使用できますが、CsvWriterクラスはコレクションを受け入れません。私のメタデータクラスは

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

レコードを設定したら、各行をcsvファイルに書き込みます。提案してください。

9
Maverick

きっとあなたのためにこれを行う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")));

[〜#〜] edit [〜#〜]幸運なことに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);
}
11
Henrik

CSVWriter を使用すると、ArrayListを配列に変換し、それをwriterに渡すことができます。

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

オブジェクト(この場合はメタデータ)のArrayListがある場合は、CSVWriterの代わりにBeanToCSVを使用します。

使い方の例は opencsvソースコードのBeanToCSVTest を参照してください。

0
Scott Conway