CSV読み取りセルの文字列中にスペースがある場合について

解決


のりたま  2020-08-29 15:08:36  No: 149061

お世話になります。
以下の環境でちょっとした開発をしています。
Delphi 10.1 Berlin ENTERPRISE
Windows 10 Pro 64bit

CSVファイル(カンマ区切り)を下記のように読み取りListViewに表示させるアプリを作っています。
しかし、Excelのセルの文字列中にスペースがある場合
カンマとみなしてしまいます。
(セル例: 123 456 789)

文字列中にスペースがあっても分割されない方法はありますでしょうか。
現在のコードは以下の通りです。

    row_list  := TStringList.Create;
    cell_list := TStringList.Create;
    try
      //ファイルを読み込み
      row_list.LoadFromFile(convF.Text);

      //1行ずつ取り出す-------------------------------------------
      for iRow := 0 to row_list.Count - 1 do
      begin

        //1行を各cellに分解
        cell_list.CommaText := row_list[iRow];

        //リストビューの追加リストと、list_itemをリンクさせる
        list_item := ListView1.Items.Add;

        //1列目
        if cell_list.Count > 0 then
          list_item.Caption := cell_list[0];

        //2列目以降
        if cell_list.Count > 1 then
          for iCell := 1 to cell_list.Count - 1 do
          begin
            list_item.SubItems.Add(cell_list[iCell]);
          end;  //next iCell
      end;  //next iRow-----------------------------------------
    finally
      row_list.Free;
      cell_list.Free;
    end;

アドバイス頂けませんでしょうか。
よろしくお願いいたします。


igy  2020-08-29 16:35:38  No: 149062

試していませんが、

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

にあるように、DelimiterプロパティとStrictDelimiterプロパティを設定してみるのは、いかがですか?


のりたま  2020-08-29 16:52:35  No: 149063

igyさん、いつもお世話になります。
ご案内頂いたサイトはネットで見つけて
試していたのですが以下の行のSLで引っかかってコンパイルできずどうしていいかわかりませんでした。
SL2.DelimitedText := SL[i]; // Delimiter で指定された区切り文字のみで分割
**************************************************************************************
var
  i, l: Integer;
  SL1: TStringList;
  SL2: TStringList;
begin
  SL1 := TStringList.Create;
  SL2 := TStringList.Create;
  try
    SL2.Delimiter := ',';           // カンマ区切り
    SL2.StrictDelimiter := True;    // Delimiter で指定された区切り文字以外は許容しない
    SL1.LoadFromFile('TEST.CSV');
    for i:=0 to SL1.Count-1 do
      begin
        SL2.DelimitedText := SL[i]; // Delimiter で指定された区切り文字のみで分割
        for l:=0 to SL2.Count-1 do
          StringGrid1.Cells[i, l] := SL2[l];
      end;
  finally
    SL2.Free;
    SL1.Free;
  end;
end;


igy  2020-08-29 16:55:49  No: 149064

>以下の行のSLで引っかかってコンパイルできずどうしていいかわかりませんでした。 
SL[i]

SL1[i]
にしてみるのは、いかがですか?


のりため  2020-08-29 17:04:24  No: 149065

igyさん、早々のお返事ありがとうございます。
コンパイルはできました。
実行したところ
CSVの行・列とStringGrid行・列の行・列が反対になってしまいました。
合わせるにはどこを変えればいいのでしょうか。


igy  2020-08-29 17:25:03  No: 149066

ためしていませんが、

> StringGrid1.Cells[i, l] := SL2[l]; 

StringGrid1.Cells[l, i] := SL2[l]; 
にしてみるのは、いかがですか?


のりたま  2020-08-29 18:25:54  No: 149067

igyさん、ありがとうございます。
お陰様で思ったことができました。
とっても感謝しています。
本当にありがとうございました。
今後ともよろしくお願いいたします。
お会いしてあいさつできないのが残念です。


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








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