CSV出力時にすべての項目にダブルクォートをつけるには?

解決


NEP  2004-12-24 19:46:44  No: 12467

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"

よろしくお願い致します。


大豆Z  2004-12-24 20:44:30  No: 12468

ヘルプ参照
VCL リファレンス
TStrings.CommaText

CommaText を取得するときに文字列リストの文字列に
スペース,カンマ,または引用符がある場合には・・・


NEP  2004-12-24 21:04:29  No: 12469

大豆Z様、早速のご回答ありがとうございます。

Helpを参照する限り、
「文字列にスペース,カンマ,または引用符がある場合には,
  文字列は二重 引用符で囲まれる」
つまり、
 「文字列にスペース,カンマ,または引用符がない場合には,
   文字列は二重引用符で囲まれない」
ということになりますよね?

そうしたとき、どのようにコーディングすればいいのか
わかりません。
もしお手数でなければ、私のコーディングのどこを変更すれば良いのか
具体的に教えて頂けませんでしょうか?
よろしくお願い致します。


@っしー  2004-12-24 21:20:02  No: 12470

TStringListを使用して、CSVファイルを作成する場合は、ご希望の動作は無理のようですので、自前で二重引用符を付加した文字列を連結後に、ファイルに吐き出せば良いのではないですか?


大豆Z  2004-12-24 21:28:34  No: 12471

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;


大豆Z  2004-12-24 21:40:36  No: 12472

上の行を追加して、
  Writeln(CsvFile,StrList.CommaText);

  Writeln(CsvFile,CommaText(StrList.Text));
にかえて  試してください。


NEP  2004-12-24 22:26:58  No: 12473

@っしー 様 
  おっしゃるとおりでした。 ありがとうございました。

大豆Z  様
  貴重なお時間をコーディングに割いて頂きまして
  ありがとうございました。
  お蔭様で、希望通りの結果を得ることができました。  

<解決方法>
  CSV出力時、TStringListのCommaTextを使用して
  「"(ダブルクォーテーション)」を
  全項目に付加することは、不可能。
  よって、手動で「"(ダブルクォーテーション)」を付加する。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加