Excelで機能するように、CSVファイルでカンマと音声マークをエスケープするにはどうすればよいですか?


110

CSVファイルを生成しています(タブではなくカンマで区切られています)。ユーザーは、CSVファイルをダブルクリックしてExcelで開く可能性があります。データにコンマとスピーチマークが含まれている可能性があるため、次のようにエスケープします。

Reference, Title, Description
1, "My little title", "My description, which may contain ""speech marks"" and commas."
2, "My other little title", "My other description, which may also contain ""speech marks"" and commas."

私が知る限り、それは常にそうする方法でした。これが私の問題です。Excel2010でこのファイルを開くと、エスケープが考慮されません。スピーチマークがシートに表示され、カンマによって新しい列が作成されます。

回答:


219

私たちは最終的にこれに対する答えを見つけました。

Excelは、列の値の前にスペースがない場合にのみ、カンマとスピーチマークのエスケープを考慮します。したがって、このようなスペースなしでファイルを生成しています...

Reference,Title,Description
1,"My little title","My description, which may contain ""speech marks"" and commas."
2,"My other little title","My other description, which may also contain ""speech marks"" and commas."

...問題を修正しました。これが誰かを助けることを願っています!


2
これは私が以前に遭遇した問題であり、私はいつもそれを忘れています。Excelは混乱を招くだけであり、そもそも有用なルールではないため、この動作を中止する必要があります。それまたはcsvは、コンマの間に空白を入れてはいけません。
ジャックマシュー

61

ランダムと思われる場合のルールは次のとおりです。これらのルールに基づいて効用関数を作成することができます。

  1. 値にコンマ、改行、または二重引用符が含まれている場合、文字列値は二重引用符で囲まれて返されます。

  2. 値に含まれる二重引用符は、別の二重引用符でエスケープする必要があります。

  3. 値にコンマ、改行、または二重引用符が含まれていない場合、文字列値は変更されずに返されます。


4
コンマ、二重引用符、または改行を含まないものを引用符で囲むと、何か害になりますか?
Erik Reppen 2014年

2
ErikReppenは通常は害になるとは思いません。私はJavaのバックグラウンドに属しており、ヒープメモリ内に独自の共有があるため、古い文字列のテキストを置き換えて新しい文字列を作成しないことをお勧めします。必要に応じて、すべての値を無条件に置き換えて、問題が発生しないはずの問題が発生するかどうかをお知らせください。
AlphaBetaGamma 2015年

2
スペースで開始または終了するフィールドは引用符で囲む必要があります。
Jonathan Rosenne、2015

2

Yashuの指示に従って、私は次の関数を記述しました(これはPL / SQLコードですが、他のどの言語にも簡単に適応できるはずです)。

FUNCTION field(str IN VARCHAR2) RETURN VARCHAR2 IS
    C_NEWLINE CONSTANT CHAR(1) := '
'; -- newline is intentional

    v_aux VARCHAR2(32000);
    v_has_double_quotes BOOLEAN;
    v_has_comma BOOLEAN;
    v_has_newline BOOLEAN;
BEGIN
    v_has_double_quotes := instr(str, '"') > 0;
    v_has_comma := instr(str,',') > 0;
    v_has_newline := instr(str, C_NEWLINE) > 0;

    IF v_has_double_quotes OR v_has_comma OR v_has_newline THEN
        IF v_has_double_quotes THEN
            v_aux := replace(str,'"','""');
        ELSE
            v_aux := str;
        END IF;
        return '"'||v_aux||'"';
    ELSE
        return str;
    END IF;
END;

0

少なくともExcel 2016では、二重引用符をエスケープしなくても、単一引用符もうまく機能します。

'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'

Excelはそれを5列に配置します(「テキストから列へ」ウィザードで「テキスト修飾子」として単一引用符を選択した場合)


-3

二重引用符を付けた後でも、この問題が数日間ありました。

パイプ区切り文字をカンマに置き換えたところ、問題なく動作しました。


1
必要に応じてOPがコピーして貼り付けることができるように、うまくいったことのサンプルを提供する必要があります。
Reuben Tanner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.