TStringListの中に重複する文字列があるか検索するには?

解決


Kirameki  2010-09-16 18:19:05  No: 39162

500行くらいのcsvファイルをTStringListに読み込んで、1行目の3番目の文字列が、TStringListの中に重複していないかチェックし、続いて2行目の3番目の文字列が重複していないかチェックする。このように最終行まで重複チェックをしたいです。

今はTStringListにCSVファイルを読み込むところまでできました。
この後どのように、重複チェックをしたらよいかアドバイスを頂きたいのですが、よろしくお願いします。

環境は、XP、Delphi7です。


TS  2010-09-16 20:35:45  No: 39163

>1行目の3番目の文字列
3番目の文字では無いみたいですが、具体的には1行がどんなデータに
なっているのでしょうか。

>この後どのように、重複チェックをしたらよいか
500行ぐらいでしたら、単純に行数分をチェックしたらいいと思いますが。


kirameki  2010-09-16 20:58:42  No: 39164

1行のデータは、
12345,aabbcc,555,456123,789456,あいうえお,012345,かきくけこ,789456,さしすせそ,・・・・・
のように、50個くらい文字列があります。


take  2010-09-16 23:06:42  No: 39165

3番目のデータしか重複チェックをしない場合こんな感じか?
あとテキストエディタで書いたのでスペルミスとかあるかも

var
  t,ts,tc : TStringList;
  i : Integer;
  s : string;
begin
  t  := TStringList.Create;                // カンマ区切り分解用
  ts := TStringList.Create;                // CSVファイル読み込み用
  tc := TStringList.Create;                // 重複チェック用
  try
    ts.LoadFromFile('test.csv');           // CSVを読み込んだとする
    for i := 0 to ts.Count-1 begin         // 行数分ループ
      t.Commatext := ts[i];                // カンマ区切りで分解
      s := t[2];                           // 3番目のデータを取り出す
      if tc.IndexOf(s) <> -1 then begin    // 重複している場合
         // ここに重複時の処理を書く
      end;
      tc.Add(s);                           // 重複チェックリストに追加
    end;
  finaly
    tc.Free;
    ts.Free;
    t.Free;
  end;
end;


  2010-09-17 06:39:41  No: 39166

sl  (stringlist)  を作る
→sl  に  3番目の要素文字列を設定、Objects  に元の文字列のレコード番号を設定。

→slをソート。

→sl[i] = sl[i -1]  なら、integer(sl.objects[i]) 行目とinteger (sl.objects[i-1]) 行目のレコードは重複。


kirameki  2010-09-22 05:36:10  No: 39167

takeさん、サンプルコードありがとうございます。
重複チェックできました。
IndexOfという関数はとても便利ですね!


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

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






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