2016-01-28 31 views
7

私はArrayList<Metadata>ですが、LinqToCsvに似たパラメータとしてArrayList <>を受け取る書き込みメソッドを持つCSVファイルを扱うためのJava APIがあるかどうかを知りたいと思います。ネット。私が知っている通りOpenCSVが利用可能ですが、CsvWriterクラスはコレクションを受け入れません。 私のメタデータクラスは、私は、レコードを読み込むと、私はcsvファイルに各行を書きたいArrayList <Object>をCSVファイルに書き込む方法

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

です。 お勧めします。

+0

なぜでしょうか。 javacsvはどうですか? – Satya

答えて

8

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

EDIT あなたはあなたの処分でのJava 8とストリームAPIを持っているとして、これは伝統的なリストを使用して、ほぼ同じくらい簡単になりそう幸運すべきではありません。 CSVWriterを使用することにより

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

オブジェクトの任意の数の[ストリーム](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#package.description)を作成します。同じタイプ。ストリームはJava 8の新機能です。 – Henrik

+0

Java 7にバインドされているため、Stream.of()を認識できませんでした。ストリーム7なしで、つまりJava 7で可能な方法はありますか。 – Maverick

+0

ストリームをマッピングして収集することはちょっといいですね。更新された回答を参照してください。各行を分割した行に入れておくのが最後です。 – Henrik

1

、あなたは配列にArrayListを変換し、ライターにそれを渡すことができます。

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

これはjava.lang.ArrayStoreExceptionです。 – Maverick

0

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

使用方法の例はBeanToCSVTest in the opencsv source codeをご覧ください。

+0

通常、回答は独自のものにする必要があります。小さなコードサンプルクラスを追加できますか?リンクされた例は、ほぼ500行です。 –

+0

mmmmkay - BeanToCSVTest内のtestWriteQuotes()テストでは、testDataのarrayListを受け取り、その結果を指定されたWriterに送信します(テストケースの場合は、結果をテストできるようにStringWriterです。私は大変忙しいので、例を書く時間がありません。openCSVの大半は、全体としてはあまりにも多すぎると認めているが、例として個別に見ることができるというテストがあります今後、私はその質問に最もよく答える特定のテストに絞って試してみます。 –