ANTLR によって生成された Java パーサーは、任意に大きなファイルをストリーミングできますか?
UnbufferedCharStream を使用して Lexer を構築しようとし、それをパーサーに渡しました。UnbufferedCharStream で size を呼び出したために UnsupportedOperationException が発生しましたが、UnbufferedCharStream で size を呼び出すことはできないという説明が例外に含まれていました。
new Lexer(new UnbufferedCharStream( new CharArrayReader("".toCharArray())));
CommonTokenStream stream = new CommonTokenStream(lexer);
Parser parser = new Parser(stream);
私は基本的に、豚を使用してhadoopからエクスポートしたファイルを持っています。「\n」で区切られた多数の行があります。各列は「\t」で分割されます。これは、バッファ付きリーダーを使用して各行を読み取るため、Java で簡単に解析できます。次に、「\t」で分割して各列を取得します。しかし、ある種のスキーマ検証も必要です。最初の列は適切にフォーマットされた日付で、その後にいくつかの価格列、いくつかの 16 進列が続く必要があります。
生成されたパーサーコードを見ると、次のように呼び出すことができます
parser.lines().line()
これにより、概念的に繰り返し処理できるリストが得られます。しかし、リストを取得するまでに、リストのサイズは固定されているようです。これは、パーサーがおそらくファイル全体を既に解析していることを意味します。
非常に大きなファイルをストリーミングできる API の別の部分はありますか? ビジターまたはリスナーを使用して、ファイルを読み取っているときに呼び出される方法はありますか? ただし、ファイル全体をメモリに保持することはできません。合いません。