2017-09-13 81 views
0

我使用了InputStream,並且在解析時,如果在一列中有一個",",那麼它就認爲它是一個單獨的列。 ex - abc, xyz, "m,n" 然後解析的輸出是abc , xyz, m, n 這裏m和n被視爲單獨的列。如何使用Java中的一些解析器解析低內存中的csv?

+0

也許[java.io.StreamTokenizer](https://docs.oracle.com/javase/8/docs/api/java/io/StreamTokenizer.html)是一種可能性。或者像[JFlex](http://jflex.de)這樣的掃描生成器。但是,您必須知道如何設置CSV文件的語法,他們不是「開箱即用」的解決方案。 –

+0

什麼是您的文件的數據結構,以及解析後應如何處理結果?程序可以消耗多少內存? –

+0

您不需要太多內存來解析CSV。你需要的內存是*存儲*一切。解決方案:不要。一次處理一行。 – EJP

回答

2

我真的很喜歡Apache Commons CSVParser。這幾乎是從他們的用戶指南逐字:

Reader reader = new FileReader("input.csv"); 
final CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT); 
try { 
    for (final CSVRecord record : parser) { 
     final String string = record.get("SomeColumn"); 
     ... 
    } 
} finally { 
    parser.close(); 
    reader.close(); 
} 

這是簡單的,可配置的和麪向行。

你可以這樣配置它:

final CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.withHeader().withDelimiter(';')); 

爲了記錄在案,這樣的配置是不必要的,因爲CSVFormat.DEFAULT工作正是你想要的方式。

這將是我第一次嘗試看它是否適合內存。如果沒有,你可以針對低內存佔用更具體一點嗎?

+0

感謝回覆 CSVParser將整個文件加載到存在問題的內存中。 如果文件大小爲1GB,那麼內存消耗已經是1GB左右。 – somey

+0

@somey CSVParser可以做到這兩點:全部讀入內存,並明智地閱讀記錄。見https://commons.apache.org/proper/commons-csv/apidocs/index.html –

+0

@somey你如何解析它?這部分代碼也可以將內容讀入內存。你能告訴我們你是如何做到的嗎? 此外,你可以連接'jvisualvm',看看究竟是消耗多少內存。也許需要gc運行? –