74

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

残念ながら、データの内容はかなりトリッキーかもしれません。それでもコンマはデリミネーターですが、行の一部のデータは次のようになります。

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

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

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

冗談ではありません。Javaによって生成されたCSVファイルからExcelまたはOpenOfficeに妥協することなく上記のコメントを表示する必要があります。もちろん、他の通常のエスケープ状況(つまり、通常の二重引用符とタプル内の通常のコンマ)を台無しにすることはできません。正規表現が強力であることは知っていますが、このような複雑な状況でどのように目標を達成できるでしょうか。

4

7 に答える 7

119

いくつかのライブラリがあります。以下に 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();
    

こちらからダウンロードできます

于 2012-05-04T16:13:14.530 に答える
35

Excel は、まったく同じ状況を処理できなければなりません。

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

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

ちなみに、Excelで使用されているフォーマットは公開されています...

****編集 1:**** これが Excel の機能
です ****編集 2:**** 囲みとして " を使用すると、phpfputcsvは Excel とまったく同じことを行うことに注意してください。

rdeslonde@mydomain.com
Richard
"This is what I think"

これに変換されます:

Email,Fname,Quoted  
rdeslonde@mydomain.com,Richard,"""This is what I think"""
于 2012-05-04T15:34:31.783 に答える
3

また、 Python が Excel 互換ファイルをどのように書き込むかを確認することもできます。csv

Excel のデフォルトは、リテラルの引用符を 2 倍にすることだと思います。つまり、リテラルの引用符""".

于 2012-05-07T13:47:30.777 に答える