検索結果が複数の時の抽出の仕方

スクリーンショット (404)

※上の表はExcelで作成しましたが、実際にはシステムで検索した時の検索結果画面だと思っていただけると幸いです。

写真のように、検索結果が複数件でてきたとします(写真では例として7件)

その中で
①:「番号」前8桁が数字で直後に「_」があるものを抽出(ここではNo1,No3,No5,No6,No7)
②:①のなかで「番号」後ろ5桁の数字が最も大きいものの「番号」を取得する(ここではNo7の番号になります)

実際には検索結果が出てきた中で「番号」が前8桁が数字で直後に「_」があるもの中で「番号」が後ろ5桁最も大きいもののレコードの「番号」を取得したいのです。

どんなアクティビティを使用すればいいのか、どんなふうに組めばいいのかご教示いただけますと幸いです。

よろしくお願いいたします。

こんにちは

細かい条件が不明ですが、データがきれいなものばかりでしたら以下で抽出可能です。

dt.AsEnumerable.Where(Function(r) System.Text.RegularExpressions.Regex.IsMatch(r("番号").ToString,"^\d{8}_")).OrderBy(Function(r) Int32.Parse(System.Text.RegularExpressions.Regex.Match(r("番号").ToString,"\d{5}$").Value)).Last().Item("番号").ToString

dt : DataTable

ちなみに、アクティビティはデータスクレイピングを使うのですか?

はい、まずはデータスクレイピングで表をDataTable化した方が良いと思います。

dt.AsEnumerable.Where(Function(r) System.Text.RegularExpressions.Regex.IsMatch(r(“番号”).ToString,“^\d{8}_”)).OrderBy(Function(r) Int32.Parse(System.Text.RegularExpressions.Regex.Match(r(“番号”).ToString,“\d{5}$”).Value)).Last().Item(“番号”).ToString

は、代入アクティでしょうか…?

文字列が返りますので、代入アクティビティの場合は文字列変数でうけてください。
メッセージボックス等でも表示可能です。

ちなみにデータスクレイピングで取得したとき、システム上に「「番号」前8桁が数字で直後に「」があるもの」がなかったとき、
dt.AsEnumerable.Where(Function(r) System.Text.RegularExpressions.Regex.IsMatch(r(“番号”).ToString,“^\d{8}
”)).OrderBy(Function(r) Int32.Parse(System.Text.RegularExpressions.Regex.Match(r(“番号”).ToString,“\d{5}$”).Value)).Last().Item(“番号”).ToString
をするとエラーになりますか?

できればちなみにデータスクレイピングで取得したとき、システム上に「「番号」前8桁が数字で直後に「_」があるもの」がなかったときは、登録日が最新のものの番号を取得したいです。(例えばシステム上にNo2、No4のレコードしか存在しなかった場合、登録日がより最新のNo4の番号を取得したい)

よろしくお願いいたします。

こんにちは

エラーになります。
対象が無い可能性がある場合は、OrderByの手前で切って、中身があるかを確認すれば良いかと思います。

できればちなみにデータスクレイピングで取得したとき、システム上に「「番号」前8桁が数字で直後に「_」があるもの」がなかったときは、登録日が最新のものの番号を取得したいです。

上記の条件分けにそって、ことなるロジックを記述することになります。

可能でしたらダミーでも結構なので、入力と出力のサンプルファイルを添付いただくと良いかと思います。

ありがとうございます。この場合、代入アクティビティを使用した場合の左辺はオブジェクト型になりますか?(string型はコンパイルエラーになってしまいます)

こんにちは

arrDr = dt.AsEnumerable.Where(Function(r) System.Text.RegularExpressions.Regex.IsMatch(r("番号").ToString,"^\d{8}_")).ToArray

としてください。arrDr はDataRow配列です。

arrDrの中に要素があるかどうかは、 arrDr.Any の条件式で判定できます。

ありがとうございます。
arrDr.Any の条件式であればtrue、なければFlaseにいくんですよね。

また次の処理ですが
あればtrueなのでその中に、
OrderBy(Function(r) Int32.Parse(System.Text.RegularExpressions.Regex.Match(r(“番号”).ToString,“\d{5}$”).Value)).Last().Item(“番号”).ToString
を記載すればいいのでしょうか。

こんにちは

 arrDr.OrderBy(Function(r) Int32.Parse(System.Text.RegularExpressions.Regex.Match(r("番号").ToString,"\d{5}$").Value)).Last().Item("番号").ToString

としてください。
なおこちらも対象データがない(末尾に5桁の数字が無い場合)はエラーとなりますので
そのようなケースがある場合は式を変える必要があります。

ご丁寧にありがとうございます。
こちらできました!

No2とNo4だけだった場合、「登録日」が最新のものの「番号」を取得したいのですが、
登録日の比較はどうすればいいのでしょうか?

こんにちは

よく使われる方法として、データテーブルを登録日で昇順にソートして、最後の行を取得する等になります。

dt.AsEnumerable.OrderBy(Function(r) DateTime.Parse(r("登録日").ToString)).Last().Item("番号").ToString

のようになるのではと思います。

ありがとうございました!たすかりました!

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