1. ホーム
  2. java

CSVファイルでカンマとダブルクォートを同時にエスケープするには?

2023-11-25 03:12:28

質問

OracleからcsvファイルへデータをエクスポートするJavaアプリを書いています。

残念ながら、データの内容はかなりトリッキーかもしれません。カンマは区切り文字なのですが、ある行のデータはこのようになっていることがあります。

| ID    |   FN    |   LN   |  AGE   |  COMMENT                   |
|----------------------------------------------------------------|
| 123   |  John   |  Smith |   39   | I said "Hey, I am 5'10"."  |
|----------------------------------------------------------------|

の文字列の1つです。 comment の列の一つです。

私は、"Hey, I am 5'10"." と言った。

冗談抜きで、私はJavaで生成されたCSVファイルからExcelやOpen Officeで妥協せずに上記のコメントを表示する必要があり、もちろん他の正規エスケープ状況(すなわち、正規ダブルクォート、タプル内の正規カンマ)を台無しにすることはできません。正規表現が強力であることは知っていますが、このような複雑な状況で目標を達成するにはどうしたらよいでしょうか?

どのように解決するのですか?

いくつかのライブラリがあります。以下に2つの例を示します。


❐ Apache Commons Lang

アパッチコモンズランゲージ には、文字列 (CSV, EcmaScript, HTML, Java, Json, XML) をエスケープしたりアンエスケープしたりするための特別なクラスが含まれています。 org.apache.commons.lang3.StringEscapeUtils .

  • 脱出 をCSVに変換

    String escaped = StringEscapeUtils
        .escapeCsv("I said \"Hey, I am 5'10\".\""); // I said "Hey, I am 5'10"."
    
    System.out.println(escaped); // "I said ""Hey, I am 5'10""."""
    
    
  • 脱出 をCSVから削除

    String unescaped = StringEscapeUtils
        .unescapeCsv("\"I said \"\"Hey, I am 5'10\"\".\"\"\""); // "I said ""Hey, I am 5'10""."""
    
    System.out.println(unescaped); // I said "Hey, I am 5'10"."
    
    

* からダウンロードできます。 ここから .


➤ OpenCSV

もし、あなたが OpenCSV を使えば、エスケープやアンエスケープを気にすることなく、コンテンツの書き込みや読み出しだけができます。

  • ファイルを書き込む。

    FileOutputStream fos = new FileOutputStream("awesomefile.csv"); 
    OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
    CSVWriter writer = new CSVWriter(osw);
    ...
    String[] row = {
        "123", 
        "John", 
        "Smith", 
        "39", 
        "I said \"Hey, I am 5'10\".\""
    };
    writer.writeNext(row);
    ...
    writer.close();
    osw.close();
    os.close();
    
    
  • ファイルを読み込んでいます。

    FileInputStream fis = new FileInputStream("awesomefile.csv"); 
    InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
    CSVReader reader = new CSVReader(isr);
    
    for (String[] row; (row = reader.readNext()) != null;) {
        System.out.println(Arrays.toString(row));
    }
    
    reader.close();
    isr.close();
    fis.close();
    
    

* からダウンロードできます。 ここから .