CSVを特定の行だけStringGridに表示するには?

解決


SIRO  2007-03-15 21:36:06  No: 25334

初めて質問させていただきます。
次のデータから例えば'SIRO'の行だけを取り出し、StringGridに表示したくて
サンプルをまねて作ってみたのですが、'SIRO'でない行が空白で残ります。
'SIRO'でない時はfor〜の中で Rows[i]の[i]を1減らせば良いかな
とも思いましたがうまく行きません。
何方かご指導よろしくおねがいします。

------------------------
IRO,
KURO,1,6,7,
SIRO,2,A,5,
SIRO,3,B,10.9,
KIIRO,4,1,6,
SIRO,5,6,7,
-------------------------

 procedure TForm1.Button1Click(Sender: TObject);
var
  SL1, SL2 : TStringList;
  MaxCol, i : Integer;
begin
  if OpenDialog1.Execute then
    begin
      SL1 := TStringList.Create;
      SL2 := TStringList.Create;
      try
        SL1.LoadFromFile( OpenDialog1.FileName );
        with StringGrid1 do
          begin
            RowCount := SL1.Count;
            MaxCol := 0;
            for i := 1 to RowCount - 1 do
        begin
      SL2.CommaText := SL1.Strings[i];
       if MaxCol < SL2.Count then MaxCol := SL2.Count;

         if SL2[0] = 'SIRO' Then      //  'SIRO'だけ抜き出し
           begin
            SL2.Delete(0);   //最初の項目を削除
            Rows[i].Assign(SL2);
           end ;
         end;
       end;
      finally
        SL2.Free;
        SL1.Free;
      end;
    end;
end;


Basser  2007-03-15 22:41:26  No: 25335

TStringList上でデータの整形をした方がいいのでは?
TStringGridは行削除が出来ないので面倒です。
下記を参考にして見て下さい。

  procedure TForm1.Button1Click(Sender: TObject);
  var
    TextBuf, LineBuf: TStringList;
    MaxCol, I : Integer;
  begin
    MaxCol := 1;
    TextBuf:= TStringList.Create;
    LineBuf:= TStringList.Create;
    try
      TextBuf.LoadFromFile('aaa.txt');

      // 該当データ以外の削除及び書込データの整形
      for I:= TextBuf.Count - 1 downto 0 do
      begin
        LineBuf.CommaText:= TextBuf[I];
        if AnsiCompareText(LineBuf[0], 'SIRO') <> 0 then
          TextBuf.Delete(I)
        else
        begin
          LineBuf.Delete(0);
          if LineBuf.Count > MaxCol then MaxCol:= LineBuf.Count;
          TextBuf[I]:= LineBuf.CommaText;
        end;
      end;

      // グリッドの行列数設定
      StringGrid1.ColCount:= MaxCol;
      if (TextBuf.Count > 0) then
        StringGrid1.RowCount:= TextBuf.Count else
        StringGrid1.RowCount:= 1;

      // データ書込
      for I:= 0 to TextBuf.Count - 1 do
        StringGrid1.Rows[I].CommaText:= TextBuf[I];
    finally
      LineBuf.Free;
      TextBuf.Free;
    end;
  end;


SIRO  2007-03-16 04:39:50  No: 25336

Basserさん、思いどおりに読み込めました。
早速回答ありがとうございました。

>TStringGridは行削除が出来ない
そうだったんですね。それを知らずに苦労していました。

>TStringList上でデータの整形をした方がいいのでは?
実はそれも上手く使いこなせていません。
いただいたリストを印刷して勉強します。

>if AnsiCompareText(LineBuf[0], 'SIRO') <> 0 then
・・・は、True か False かどうかの事でしょうね。

どれも基礎的なことなのでしょうが、まだhelpも
迷路と呪文の様に見えます。
今度ともよろしくお願いします。


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

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






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