2つのデータテーブルの全列比較

※一度投稿させていただきましたがうまく説明できておらず、編集ができないため新しく作りました。

使用データ
インプット→dtA.csv、dtB.csv データサンプル.zip (542 Bytes)
アウトプット→dtUpdate、dtNewdata

やりたいこと
①dtBのD列「お問合せコード」をdtAの「お問合せコード」から検索し一致する行を探す
②dtBの現在の行とdtAの①で一致した行の全列を比較

→①で検索結果がなければdtNewdataへデータ行を追加(dtBで新規追加されている)
→②で一致しなければdtUpdateへデータ行を追加(同一コードでデータが更新されている)

試したこと
まず、dtAとdtBをcsv読み込みアクティビティだとヘッダーが同一のため扱えず条件式がうまく書けなかったためExcel
に変換した上で、①を以下のフローで試してみたところうまくいきました。

代入:Match(boolean) = False
dtBのFor each row(row)
dtAのFor each row(line)
row.Item("お問合せコード").ToString = line.Item("お問合せコード").ToString
True 代入:match = True
dtAのFor each row終了
条件分岐: match = False
True データ行を追加
dtBのFor each row終了
範囲に書き込み

上記フローを、できればcsvのままできないか模索中です。
また、②の実現方法がわからず手も足も出ない状況です。
お力添えいただけないでしょうか。

こんにちは

やり方はいろいろあると思いますが、データテーブルを結合アクティビティを使った方が楽なような気がします。

データテーブルを結合アクティビティで
入力データテーブル1 dtA
入力データテーブル2 dtB
出力データテーブル dtC

結合型 Full

列の表1 “お問合せコード”
列の表2 “お問合せコード”
操作 =

としておいて
内容を確認するために、dtCをEXCEL等に出力してみてください。(いろいろ見えてくると思うので)

このデータテーブルを加工することにより

dtAになくてdtBにあるもの:No列で空文字でフィルター
dtAとdtBにあるもの No列で空文字以外でフィルター→あとは各行を比較

のように処理できると思います。

ありがとうございます。
こちらも、Excelでの範囲読み込みでAdd headerオンにしないと使用できないでしょうか?
csv読み込みで先頭行をヘッダにするはOFFにしたら(同一ヘッダーのため)列名ではなくColumnで設定しなければいけませんでした。

ひとまずcsvでcolumn指定で実施しみました。
添付画像のようになりましたが、勘が悪くこれをどのように扱えば良いのかさっぱりわからず。。
出力C

行のループの中で、Column2とColumn2_1などの列同士で比較するということでしょうか?

こんにちは

こちらも、Excelでの範囲読み込みでAdd headerオンにしないと使用できないでしょうか?
csv読み込みで先頭行をヘッダにするはOFFにしたら(同一ヘッダーのため)列名ではなくColumnで設定しなければいけませんでした。

ヘッダーはONで動きます。あるいは文字コードの問題かもしれません。添付のデータですと、ReadCSVでEncodingは”Shift_JIS”を指定しなければなりませんので、もしこの指定が無いのであれば、指定してみてください

結果は以下のようになります。(添付いただいているものとほぼ同様かと思います)

img20210712-2

まずdtAになくて、dtBにあるものは
例えばNo列が空欄ですので、これに注目すると、データテーブルをフィルタリングアクティビティで
No列がEmptyであることを条件に抽出すればよいことになります。

逆にdtAとdtBの両方にあるものはNo列とNo_1列がともに空欄ではないと思いますので、データテーブルをフィルタリングアクティビティで条件を指定して抽出できます。

あとはそれぞれ抽出したデータテーブルに対してForEachRowで各行を処理することになるかと思います。

あるいは、このデータテーブルをForEachRowでイテレートして、その中で各種条件に応じて処理を行ってもよいかと思います。

ありがとうございます。

これは、抽出したdtCに対して行うのですよね?

・dtAにないデータ→フィルタリングのANDでNo列を指定する
・お問合せコード以外の列でdtAと異なるデータ→これはフィルタリングでどのように指定するのでしょうか?(実際の生データは40列以上の列があり、この40列同士を比較することになります)

また、抽出後のデータが40列+40列で80列のデータになってしまうということでしょうか?

こんにちは

これはそうです。

・お問合せコード以外の列でdtAと異なるデータ→これはフィルタリングでどのように指定するのでしょうか?(実際の生データは40列以上の列があり、この40列同士を比較することになります)

これはデータテーブルをフィルタリングではできませんので

あとはそれぞれ抽出したデータテーブルに対してForEachRowで各行を処理することになるかと思います。

こちらを適用することになります。

40列同士の比較式を記述するか、あるいは列情報を配列にしておいて、ループで回す(あるいはLINQ等を使う)ことになると思います。

また、抽出後のデータが40列+40列で80列のデータになってしまうということでしょうか?

結合した時点で80列になりますので、単なる行フィルタですと80列のままです。
もし不要な列があれば、列フィルタを指定する、列削除アクティビティ等で減らすこともできます。

ありがとうございます。
ようやく頭の中が繋がりました。
データテーブルの結合はキーが同じデータ同士を横に結合するという意味のものだったのですね。
(Noの順番をdtAのみバラバラにしてみて理解しました)

大変助かりました。ありがとうございます。

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