web-dev-qa-db-ja.com

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

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でこのファイルを開くと、エスケープは尊重されません。シートにスピーチマークが表示され、コンマによって新しい列が作成されます。

99
centralscru

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

列の値の前にスペースがない場合、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."

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

201
centralscru

以下は、ランダムだと思う場合のルールです。これらの規則に基づいて、ユーティリティ関数を作成できます。

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

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

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

54
Yashu

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;
2
aaguilera

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

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

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

0
golimar