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でこのファイルを開くと、エスケープは尊重されません。シートにスピーチマークが表示され、コンマによって新しい列が作成されます。
私たちは最終的にこれに対する答えを見つけました。
列の値の前にスペースがない場合、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."
...問題を修正しました。これが誰かを助けることを願っています!
以下は、ランダムだと思う場合のルールです。これらの規則に基づいて、ユーティリティ関数を作成できます。
値にカンマ、改行、または二重引用符が含まれる場合、文字列値は二重引用符で囲まれて返されます。
値に含まれる二重引用符は、別の二重引用符でエスケープする必要があります。
値にコンマ、改行、または二重引用符が含まれていない場合、文字列値はそのまま返されます。
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;
少なくともExcel 2016では、二重引用符をエスケープしなくても、単一引用符も正常に機能します。
'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'
Excelはそれを5列に配置します(「テキストから列へ」ウィザードで「テキスト修飾子」として単一引用符を選択した場合)