ダブルクォーテーションを含むcsvファイルの読み込みについて

解決


ぼっくり  2016-03-29 17:49:34  No: 48126

EXCELから変換したcsvファイルを読み、StringListに取り込もうとしています。

csvファイルの中身は
aaa,bbb,10,123
aaa,bbb,10,"1,234"
となっていて数値が4桁以上だとダブルクォーテーションで囲まれ
カンマが間に入っています。

このcsvファイルを
以下の方法で読もうとすると1行目はうまく取り込めますが、
2行目は1,234が1と234に分かれてしまいます。
上手く処理できる方法がありましたらご教授頂けると助かります。

----------------------------------------------------------------
  Result := CsvFileName;
  Delimiter := ',';

  // CSVファイルの読み込み
  AssignFile(W_FILE, CsvFileName);
  Reset(W_FILE);
  try
    // レコードがある場合、繰り返す。
    while not EOF(W_FILE) do
    begin
      Readln(W_FILE, W_STR); // 1行読む

      // CSVデータ分割
      StrListC := TStringList.Create;
      if W_STR <> '' then
      begin
        L := Length(Delimiter) - 1;
        N := AnsiPos(Delimiter, W_STR);
        while N > 0 do
        begin
          StrListC.Add(Copy(W_STR, 1, N - 1));
          Delete(W_STR, 1, N + L);
          N := AnsiPos(Delimiter, W_STR)
        end;
        StrListC.Add(W_STR);
      end;
  finally
    CloseFile(W_FILE)
  end; { try }


au  2016-03-29 18:41:19  No: 48127

1行分のデータをTStringList.CommaTextに放り込めば、Stringsで1列目から順番に取り出せるかと


DEKO  2016-03-30 00:39:15  No: 48128

[フィールドに空白(半角SP)が含まれる CSV ファイルを処理するには?(2006 以降)]
http://ht-deko.com/tech036.html#tech065


ぼっくり  2016-04-01 17:31:16  No: 48129

DEKO様
http://ht-deko.com/tech036.html#tech065
を参考に修正したらできました。

私の方法ですと
    StrListC.Delimiter := ',';           // カンマ区切り
    StrListC.StrictDelimiter := True;    // Delimiter で指定された区切り文字以外は許容しない

    // レコードがある場合、繰り返す。
    while not EOF(W_FILE) do
    begin
      Readln(W_FILE, W_STR); // 1行読む
      StrListC.DelimitedText := W_STR;

でダブルクォーテーションが取れました。

ありがとうございます。

au様

TStringList.CommaText
でもテストしてみます。

ありがとうございました。


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

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






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