2016-01-28 94 views
7

我有一個ArrayList<Metadata>,我想知道是否有一個Java API用於處理CSV文件,該文件的寫入方法接受ArrayList <>作爲類似於LinqToCsv的參數。淨。據我所知OpenCSV可用,但CsvWriter類不接受集合。 我的元數據類是如何將ArrayList <Object>寫入csv文件

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

一次我填寫的記錄,我想每行寫成csv文件。 請建議。

+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"))); 

編輯 如果你不會這麼幸運,有Java的8,並在您的處置流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); 
} 
+0

它創建一個[stream](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#package.description)任意數量的對象相同的類型。 Streams是Java 8的一個新特性。 – Henrik

+0

好吧,我必須使用Java 7,這就是爲什麼它不能識別Stream.of()。有沒有什麼可能的方式來做到這一點,沒有流,即在Java 7上。 – Maverick

+0

當然,映射和收集流更好。查看更新後的答案 - 您應該可以自己完成將每行放在分隔線上的最後一步。 – Henrik

1

使用CSVWriter,你可以在ArrayList轉換爲數組,並傳遞給作家。

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

這是一個java.lang.ArrayStoreException – Maverick

0

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

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

+0

通常,答案應該是獨立的。你可以添加一個小的代碼示例類嗎?鏈接的例子近500行。 –

+0

mmmmkay - 如何在BeanToCSVTest中接受testData arrayList並將結果發送給提供的Writer的testWriteQuotes()測試(對於測試用例,它是一個StringWriter,以便測試結果)對不起,我不是故意來儘管我認爲自己很拙劣,但是我很不情願,並且沒有時間去寫例子。openCSV的大部分測試都是被認爲是一個整體,但是被用作示例太多了,可以單獨看作爲例子。將來我會嘗試縮小到最能回答問題的具體測試。 –