3

何年もの間、次のロジックを使用して夜間のバッチ ジョブ中に csv ファイルを問題なく解析してきました。とにかく、私はアプリケーションを完全に書き直していますが、opencsv のようなものを使用することでパフォーマンスや品質が向上するかどうか疑問に思っていますか? 私は他の図書館での経験がないので、経験のある誰かが参加できることを望んでいました.

while ((line = br.readLine()) != null) {
    String[] items = line.split(",");


        for (int i = 0; i < items.length; ++i) {
            // Remove extra quote
            if (items[i].length > 2) {
                items[i] = items[i].replaceAll("\"", "");
            }

            // Replace blank items with nulls
            if (items[i].matches("^\\s*$")) {
                items[i] = null;
            }

        }

        String item0 = item[0];
        String item1 = item[1];
}
4

3 に答える 3

4

パフォーマンスは向上しませんが、ライブラリはコンマが埋め込まれたフィールドを処理するのに役立ちます。コンマをエスケープする代わりに二重引用符を使用する Microsoft の不快な解決策は、手動で処理するのが面倒であり、opencsv がすべてを処理します。

于 2013-10-26T04:52:21.383 に答える
0

オプションに追加するには、Jackson CsvMapper を検討してください。

Macbook Pro で jackson CsvMapper を使用して、約 4,000 個のファイルから 3,600 万行を 12 分で解析しました。それは、いくつかの場所では POJO に直接マップするために使用し、他の場所では行ごとに Object[] を読み取るために使用し、大量の補助処理を適用して入力を正規化します。

使い方もとても簡単です。

オブジェクト[]として

    CsvMapper mapper = new CsvMapper();
    mapper.enable(CsvParser.Feature.WRAP_AS_ARRAY);
    File csvFile = new File("input.csv"); // or from String, URL etc
    MappingIterator<Object[]> it = mapper.reader(Object[].class).readValues(csvFile);

POJOとして

    public class CSVPerson{
      public String firstname;
      public String lastname;
      //etc
    }

    CsvMapper mapper = new CsvMapper();
    CsvSchema schema = CsvSchema.emptySchema().withHeader().withColumnSeparator(delimiter);
    MappingIterator<CSVPerson> it = = mapper.reader(CSVPerson).with(schema).readValues(input);
    while (it.hasNext()){
      CSVPerson row = it.next();
    }

私はいつもこの図書館を称賛しています。素晴らしいです。また、非常に柔軟です。

于 2013-10-28T13:59:36.097 に答える