2017-09-13 5 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を解析するためのメモリはあまり必要ありません。あなたが記憶を必要とするのは、それをすべて保存することです。解決策:しないでください。一度に1行ずつ処理します。 – EJP

答えて

2

私は本当にApache Commonsが好きですCSVParser。これはユーザーガイドとほぼ同じです:

これはシンプルで構成可能で、行指向です。

あなたはこのようにそれを設定することができます:レコードの

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が必要ですか? –

4

があり、多くのサードパーティのCSVの構文解析ライブラリ

  1. UniVocity Parser

  2. CommonsCsv Parser

  3. OpenCsv Parser

  4. SuperCsv Parser
のような

私はUniVocity csvパーサを使用しています。これは非常に高速で、行内の区切り文字を自動的に検出します。与えられたcsvライブラリの上を通過できます。

関連する問題