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

解決


Kirameki  2010-09-16 09:19:05  No: 39162  IP: 192.*.*.*

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

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

環境は、XP、Delphi7です。

編集 削除
TS  2010-09-16 11:35:45  No: 39163  IP: 192.*.*.*

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

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

編集 削除
kirameki  2010-09-16 11:58:42  No: 39164  IP: 192.*.*.*

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

編集 削除
take  2010-09-16 14:06:42  No: 39165  IP: 192.*.*.*

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-16 21:39:41  No: 39166  IP: 192.*.*.*

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

→slをソート。

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

編集 削除
kirameki  2010-09-21 20:36:10  No: 39167  IP: 192.*.*.*

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

編集 削除