最近Uipathを触り始めた者です。
LINQを使って空白セルに特定文字を入れる方法(VB.net )をお伺いしたいです。
一応自分なりに勉強してなんとか動くコードはかけたのですが、
果たしてこれで正しいのか不安です;
処理としては、
データテーブルの「テスト1」列に
空白セルがある場合、セルに「ABCDE」と書き込むような処理を
for文で行っていたのですが、3000行を超えるデータの際
処理時間がかなりかかってしまったので、
InvokeCodeにて下記のように書きました。
dt = dt_1.AsEnumerable.Where(Function(r)r(“テスト1”).ToString.Equals(“”) Or r(“ABCDE”).ToString.Equals(“ABCDE”)).Select(Function(r)
r(“テスト1”) = “ABCDE”
Return r
End Function).CopyToDataTable
(ORで「r(“ABCDE”).ToString.Equals(“ABCDE”)」を行っているのは、空白のみで指定すると、エラーが出たためです。)
よろしくお願いいたします。
Yoichi
(Yoichi)
March 5, 2021, 9:04am
2
こんにちは
この式ですとWhereメソッドですでにデータがある行が削除されてしまうので
期待の結果にならないと思います。やりたいことは例えば以下ではないでしょうか?
dt = dt_1.AsEnumerable.Select(Function(r)
If r("テスト1") Is Nothing OrElse String.IsNullOrEmpty(r("テスト1").ToString) Then
r("テスト1") = "ABCDE"
End If
Return r
End Function).CopyToDataTable
for文で行っていたのですが、3000行を超えるデータの際
処理時間がかなりかかってしまったので、
Invoke code内のループでも時間かかっていますか?
1 Like
返事が遅くなり申し訳ありません。
お早い回答ありがとうございます!!
お教えいただいたコードで機体の結果となりました!ありがとうございます!
ただ、元の式でも行が消されることはなかったです、、、
例えば、すでにdtにデータが入っていたとして、
そのあとに上記の書き換え処理をしたら、
データが代入されるのではなくのではなく、
上書き追加されるような感じなんでしょうか?
for文ですが、Invoke code内のループでは試してなかったです。
ForEachRowアクティビティを使っていました。
Yoichi
(Yoichi)
March 8, 2021, 5:50am
4
こんにちは
削除というのは、元のDataTable(dt_1)の行が削除されるという意図ではなく、
左辺のdt側に、反映されない行があるという意図でした。
for文ですが、Invoke code内のループでは試してなかったです。
ForEachRowアクティビティを使っていました。
アクティビティでのループは個々のアクティビティによるオーバーヘッドが生じるため、
繰り返し回数が多ければ、パフォーマンス的には不利になります。
Invoke Code内でしたらこのオーバーヘッドは生じませんので、それなりに高速に動作すると
思います。(=単に高速化を目的とするなら、LINQをつかう必要もないかもしれません)
dt側に反映されていました。
また、お教えいただいたコードで回した結果(dt)と、
元のコードで回した結果(dt)をExcelに出力して確認しましたが、
内容に差異はありませんでした。
ふつうは反映されないものなのだとしたら、
どこか書き方がおかしいのかもしれませんね;
そうなのですね!勉強になります!!
1 Like
system
(system)
Closed
March 11, 2021, 6:49am
6
This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.