Dtを条件『特定列が重複』で分岐させ、不要行を削除したい

UiPath 初心者です。
以下のdtで、
『項目』が重複している場合、入荷日を確認し
日付が最新のものを残し、それ以外を削除 したいです。
作り方を教えて頂きたくよろしくお願いいたします。

【元データ】 【完了後】
image image

サンプルを作ってみました。

  • まず、「項目」の部分だけを抽出して、重複を排除したリストを作る …①
  • ①の要素ごとに繰り返す
    • 元のデータテーブルから、「項目」が①の要素と同じで、かつ「入荷日」が空白でないものをフィルタする …②
    • ②に含まれるデータが 1件以上あれば(「入荷日」が入っているデータがあれば)
      • ②を、「入荷日」で降順に(新しいものが先頭に来るように)ソートする …③
      • ③の1行目(UiPath上なら 0行目)のデータが、残すべきデータになる …④
    • ②に含まれるデータが 0件であれば(「入荷日」が入っていないデータしかなければ)
      • 元のデータテーブルから、「項目」が①の要素と同じものをフィルタする …⑤
      • ⑤の1行目(UiPath上なら 0行目)のデータが、残すべきデータになる …④
    • ④のデータを、結果保存用のデータテーブルに追記する
  • 繰り返しを終わる

UCF 20210407_304622.zip (44.3 キロバイト)

2 Likes

こんな感じで作ってみました。

流れ)dataviewで重複なしの項目名に絞り込む → 項目名でループ → 入荷日が最新の行を取得 → 出力結果に入れる

注意)入荷日の新しい順にソートしたいので、フォーマットを事前に統一しています。(日、時が1桁2桁のデータが混在しているため)

forum_304622.xaml (15.0 KB)

1 Like

こんにちは

参考レベルですが、1行で書くと以下のような感じになるかと思います。

newDt = dt.AsEnumerable.GroupBy(Function(r) r("項目")).Select(Function(g) g.OrderByDescending(Function(r) if(DateTime.TryParse(r("入荷日").ToString,new Date),DateTime.Parse(r("入荷日").ToString),New DateTime(2000,1,1))).First).Select(Function(r) dt.LoadDataRow({r("NO."),r("項目"),r("入荷日")},False)).CopyToDataTable
2 Likes

cheez_RPA様
shinji様
Yoichi様

ありがとうございます。
考え方について大変勉強になりました。
また、サンプルまで作って頂き本当に分かりやすくありがとうございます。

今回は1つのYoichi様の案で作らせて頂こうと思います。

Yoichi様

こちらの部分ですが、日付の意味を教えて頂きたくよろしくお願いいたします。
また、同じ日付で時間に差がある場合の最新のとり方についても教えて頂きたくよろしくお願いいたします。

こんにちは

こちらの部分ですが、日付の意味を教えて頂きたくよろしくお願いいたします。

日付でソートしているのですが、空欄等、日時として認識できないデータの場合、どの日付と仮定してソートするかの内容になります。そのため2000/1/1に深い意味があるわけではなく、入力されるであろう日付より過去の日付であれば何時でよいです。

また、同じ日付で時間に差がある場合の最新のとり方についても教えて頂きたくよろしくお願いいたします。

DateTime型で降順にソートしていますので、時刻も含めて昇順で並べ替えられます。その並べ替えた結果の最初の要素を取得するようにしています。

1 Like

お世話になっております。
詳しく説明下さりありがとうございます。
なるほどです!!
本当にありがとうございます。
並べ替えから、削除までを1つの文で行っているのですね。
追加で質問となり申し訳ございません。

こちらの部分は、列が増える場合は1つずつ追加する対応で大丈夫でしょうか。
LoadDataRow({r(“NO.”),r(“項目”),r(“入荷日”)},False))

こんにちは

元のDataTableに書き戻していますので、その列に該当する内容を記述してください。
仮に4列あるようでしたら、配列の中身は4つにしてください

1 Like

ありがとうございます!!
無事、完成しました!!!

1 Like