web-dev-qa-db-ja.com

CSVファイルのコンマと二重引用符を同時にエスケープする方法は?

OracleからcsvファイルにデータをエクスポートするJavaアプリを作成しています

残念ながら、データの内容は非常に注意が必要です。それでもコンマがデリミネーターですが、行の一部のデータは次のようになります。

IDFNLNAGECOMMENT

123、ジョン、スミス、39、私は「ねえ、私は5'10です」と言いました。

したがって、これはcomment列の文字列の1つです。

「ねえ、私は5'10です」と言いました。

冗談ではありません。Javaによって生成されたCSVファイルからExcelまたはOpen Officeで妥協することなく上記のコメントを表示する必要があります。正規表現は強力ですが、このような複雑な状況でどのように目標を達成できますか?

62
Dreamer

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


❐Apache Commons Lang

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""."""
    
  • UnescapeCSVから

    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"."
    

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


❐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();
    

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

102
Paul Vargas

Excelはまったく同じ状況に対処できる必要があります。

それらをExcelに入れ、CSVとして保存し、テキストエディターでファイルを調べます。そうすれば、Excelがこれらの状況に適用しているルールがわかります。

Javaが同じ出力を生成するようにします。

ちなみに、Excelで使用される形式は公開されています...

****編集1:**** Excelの機能
****編集2:****エンクロージャーとして "を使用すると、PHPのfputcsvはExcelとまったく同じことを行うことに注意してください。

[email protected]
Richard
"This is what I think"

これに変換されます:

Email,Fname,Quoted  
[email protected],Richard,"""This is what I think"""
34
Tony Ennis

迅速なフィードバックをしてくれたトニーとポールの両方に感謝します。私は実際にPOJOを通して解決策を見つけました。ここにあります:

if (cell_value.indexOf("\"") != -1 || cell_value.indexOf(",") != -1) {
    cell_value = cell_value.replaceAll("\"", "\"\"");
    row.append("\"");
    row.append(cell_value);
    row.append("\"");
} else {
    row.append(cell_value);
}

要するに、セルの内側の文字列内にコンマや二重引用符のような特殊文字がある場合、最初に二重引用符を追加して("\"")、二重引用符("\"\"")をエスケープしてから、全体を二重引用符で囲みます("\""+theWholeThing+"\""など)

14
Dreamer

PythonがExcel互換のcsvファイルを書き込む方法 も見ることができます。

Excelのデフォルトはリテラル引用文字を2倍にすることだと思います-つまり、リテラル引用符"""として記述されます。

3
Li-aung Yip
"cell one","cell "" two","cell "" ,three"

これをcsvファイルに保存して結果を確認します。二重引用符を使用して自分自身をエスケープします

重要な注意

"cell one","cell "" two", "cell "" ,three"

カンマの後にスペースがあるため、異なる結果が得られます。これは「

2
A.Zaben
String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";

これにより、CSVファイルにカンマが保持されます。

0
Ashiq M