CSVを出力するとき全項目に、「"(ダブルクォート)」をつけたいのですが
うまくいきません。
どなたか教えて頂けませんでしょうか?
Delphi5でTStringListのAdd,CommaTextを使用してCSV出力を行いました。
結果、Addするデータに「,(カンマ)」が含まれていれば「""(ダブクルォート)」でデータが囲まれていますが、「,(カンマ)」が含まれていない場合には、「""(ダブクルォート)」で囲まれませんでした。
コーディングのミスなのか、元々の仕様なのか不明で対処に困っています。
以下、そのコーディングと実行結果です。
var
CsvFile : TextFile;
StrList : TStringList;
begin
StrList := TStringList.Create;
AssignFile(CsvFile, 'C:\Temp\TEST.csv');
ReWrite(CsvFile);
StrList.Add('あいう');
StrList.Add('abc');
StrList.Add('1,23');
Writeln(CsvFile,StrList.CommaText);
StrList.Free;
CloseFile(CsvFile);
end;
<実行結果>
あいう,abc,"1,23"
<希望結果>
"あいう","abc","1,23"
よろしくお願い致します。
ヘルプ参照
VCL リファレンス
TStrings.CommaText
CommaText を取得するときに文字列リストの文字列に
スペース,カンマ,または引用符がある場合には・・・
大豆Z様、早速のご回答ありがとうございます。
Helpを参照する限り、
「文字列にスペース,カンマ,または引用符がある場合には,
文字列は二重 引用符で囲まれる」
つまり、
「文字列にスペース,カンマ,または引用符がない場合には,
文字列は二重引用符で囲まれない」
ということになりますよね?
そうしたとき、どのようにコーディングすればいいのか
わかりません。
もしお手数でなければ、私のコーディングのどこを変更すれば良いのか
具体的に教えて頂けませんでしょうか?
よろしくお願い致します。
TStringListを使用して、CSVファイルを作成する場合は、ご希望の動作は無理のようですので、自前で二重引用符を付加した文字列を連結後に、ファイルに吐き出せば良いのではないですか?
function DoubleQuoteText(Text : String) : string;
var s : string; i:integer;
begin
if Length(Text)>0 then
for i := 1 to Length(Text) do
if Text[i]='"' then
s := s+ Text[i] + '"'
else s := s+ Text[i];
Result := '"' +s+ '"';
end;
function CommaText(Text : String) : string;
var sl : TStringList; i:integer;
begin
if Length(Text)=0 then Result := '""' else Result := '';
sl := TStringList.Create;
try
sl.Text := Text;
for i := 0 to sl.Count-1 do
if (i=0) then
Result := Result + DoubleQuoteText(sl.Strings[i])
else
Result := Result +','+ DoubleQuoteText(sl.Strings[i]);
finally
sl.Free
end;
end;
上の行を追加して、
Writeln(CsvFile,StrList.CommaText);
を
Writeln(CsvFile,CommaText(StrList.Text));
にかえて 試してください。
@っしー 様
おっしゃるとおりでした。 ありがとうございました。
大豆Z 様
貴重なお時間をコーディングに割いて頂きまして
ありがとうございました。
お蔭様で、希望通りの結果を得ることができました。
<解決方法>
CSV出力時、TStringListのCommaTextを使用して
「"(ダブルクォーテーション)」を
全項目に付加することは、不可能。
よって、手動で「"(ダブルクォーテーション)」を付加する。
ツイート | ![]() |