2

サンプルデータ -

ヘッダー 1、フルネーム、ヘッダー 3、ヘッダー 4

  1. 20、「ボブ、XXX」、「テスト」、30
  2. 20, "evan"s,YYY ", "test", 30
  3. 20、「トム、ZZZ」、「テスト」、30

    CSVReader csvReader = new CSVReader(reader, ',', '"');
    

2 行目は期待どおりに読み取れません。full_name 列の値に二重引用符があるためです。

そのような場合は無視したい。任意の提案をいただければ幸いです。

解析には openCSV Java API を使用します。

編集:

データベースからデータを取得しています。データベースの列フィールドの 1 つに、その値に 1 つの二重引用符が含まれています。そのため、csv データの形式が正しくありません。

4

1 に答える 1

2

univocity-parserは、エスケープされていない引用符を処理でき、opencsv よりも 4 倍高速です。このコードを試してください:

public static void main(String... args){
    String input = "" +
            "20, \"bob, XXX\", \"test\", 30\n" +
            "20, \"evan\"s,YYY \", \"test\", 30\n" +
            "20, \"Tom, ZZZ\", \"test\", 30 ";


    CsvParserSettings settings = new CsvParserSettings();

    CsvParser parser = new CsvParser(settings);
    List<String[]> rows = parser.parseAll(new StringReader(input));

    //printing values enclosed in [ ]  to make sure you are getting the expected result
    for(String[] row : rows){
        for(String value : row){
            System.out.print("[" + value + "],");

        }
        System.out.println();
    }
}

これにより、次が生成されます。

[20],[bob, XXX],[test],[30],
[20],["evan"s],[YYY "],[test],[30],
[20],[Tom, ZZZ],[test],[30],

さらに、次のいずれかを使用して、エスケープされていない引用符の処理方法を制御できます。

settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_DELIMITER);
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.STOP_AT_CLOSING_QUOTE);
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.RAISE_ERROR);
settings.setUnescapedQuoteHandling(UnescapedQuoteHandling.SKIP_VALUE);

大きなファイルを読み取るときは、次のRowProcessorように各行に対して a または iterate を使用できます。

parser.beginParsing(new File("/path/to/your.csv"));

String[] row;
while ((row = parser.parseNext()) != null) {
    // process row
}

免責事項: 私はこのライブラリの作成者です。オープンソースで無料です (Apache 2.0 ライセンス)

于 2016-09-15T23:47:47.570 に答える