1000以上のデータの比較方法について

お世話になります。
作成者の異なる2つのExcelデータについて、片方のExcelデータにもう片方のデータの一部を結合する作業をします。
キーとなる項目が無く、どちらのデータにもある氏名と生年月日で結合する行を探す処理をしていますが、どちらのExcelデータも1000以上の行があり、処理に非常に時間がかかっています。
データテーブルを比較前にソートしたり、一度ヒットした行は次は検索しないなどの処理が必要かと思いますが、具体的にイメージが湧きません。
処理の手順をご教示頂けませんか?

Hi @Masapapa
Sort the datatable

DataView view = new DataView(table)
DataTable distinctValues = view.ToTable(true, "Column1", "Column2" ...)
or
DataTable =DataTable.DefaultView.ToTable(true)

Thanks
Ashwin S

1 Like

EXCELデータ(Read RangeしたDataTable型)を結合する「データテーブルを結合」アクティビティがあります。

結合ウィザードで入力データテーブル1と2を指定して、それぞれテーブル中の列をイコールで繋いで。。。

EXCELデータは、同名同生年月日での重複データはない前提ですが…(1:1結合)

もし、同名同生年月日での重複データがあるとすれば、(1:n、n:1、n:m)それは業務要件で決定するものでしょう。

データの並び替えに関しては、「データテーブルを並び替え」アクティビティがありますが、SORTキーは1つしか指定できませんので、それぞれのテーブルにSORTキー用の列を追加して、そこに名前&タブ&生年月日を代入し、それからSORTしましょう。

1 Like

こんにちは

パフォーマンス向上のために自力でロジックを組みたいとのことかと思います。
現在総当たりで処理を行っているならオーダー的にはO(n^2)の計算量かと思いますが、ソートしても良いのであればオーダー的にはO(n log(n))レベルまで減らすことができるのではと思います。

やり方はいくつかあるかと思いますが、一例の概要を以下示します。

  1. 双方のDataTable(仮にDT1とDT2)をソートしておきます。(生年月日を第一ソートキー、氏名を第二ソートキーとしいずれも昇順とします。dataviewを使うことになるかと思います。)
  2. DT1用のindexをindex1とし初期値を0、DT2用のindexをindex2とし初期値を0とします。
  3. ループします。ループの終了条件はindex1がDT1の行数になったまたはindex2がDT2の行数になったときです。
  4. ループ内部でDT1とDT2のindex1,2のそれぞれのレコードの生年月日と氏名の値を比較します。
  • もしDT1の方が小さければこのDT1のindex1レコードは結合不要なレコード→その処理をします。index1を1増やします。
  • もしDT2の方が小さければこのDT2のindex2レコードは結合不要なレコード→その処理をします。index2を1増やします。
  • もしDT1とDT2が同じであれば、結合対象レコード→その処理をします。index1,index2とも1増やします。(生年月日と氏名で一意に決まる場合。もし決まらない場合は要件に応じた処理が必要)
  1. ループ終了後index1がDT1の行数より小さければ、DT1の残りの部分は結合不要なレコードとして処理します。またindex2がDT2の行数より小さければ、DT2の残りの部分は結合不要なレコードとして処理します。

2つの列の比較処理が煩雑であれば、今回のケースでは生年月日と氏名を結合した列を用意して、それでソート・比較しても良いかもしれません。

1 Like

回答ありがとうございます。
distinct 利用します。

HANACCHI様

ああそうですね。「データテーブルを結合」アクティビティでいけそうですね。
重複データの有無を先にdistinctを利用して確認してから結合してみます。

ありがとうございました。

1 Like

Yoichi 様

前回に続き丁寧な回答ありがとうございます。
ロボ作成時は、まさか1000以上もデータがあるとは思わず、ご指摘の総当たり処理を行っていました。
ご教示頂いたロジックを試してみたいと思います。

自分もまだまだ勉強中でございます。
よい結果が得られますように。

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.