500行くらいのcsvファイルをTStringListに読み込んで、1行目の3番目の文字列が、TStringListの中に重複していないかチェックし、続いて2行目の3番目の文字列が重複していないかチェックする。このように最終行まで重複チェックをしたいです。
今はTStringListにCSVファイルを読み込むところまでできました。
この後どのように、重複チェックをしたらよいかアドバイスを頂きたいのですが、よろしくお願いします。
環境は、XP、Delphi7です。
>1行目の3番目の文字列
3番目の文字では無いみたいですが、具体的には1行がどんなデータに
なっているのでしょうか。
>この後どのように、重複チェックをしたらよいか
500行ぐらいでしたら、単純に行数分をチェックしたらいいと思いますが。
1行のデータは、
12345,aabbcc,555,456123,789456,あいうえお,012345,かきくけこ,789456,さしすせそ,・・・・・
のように、50個くらい文字列があります。
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;
sl (stringlist) を作る
→sl に 3番目の要素文字列を設定、Objects に元の文字列のレコード番号を設定。
→slをソート。
→sl[i] = sl[i -1] なら、integer(sl.objects[i]) 行目とinteger (sl.objects[i-1]) 行目のレコードは重複。
takeさん、サンプルコードありがとうございます。
重複チェックできました。
IndexOfという関数はとても便利ですね!
ツイート | ![]() |