LINQを使って空白セルに特定文字を入れる方法(VB.net)

最近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”)」を行っているのは、空白のみで指定すると、エラーが出たためです。)

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

こんにちは

この式ですと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アクティビティを使っていました。

こんにちは

削除というのは、元のDataTable(dt_1)の行が削除されるという意図ではなく、
左辺のdt側に、反映されない行があるという意図でした。

for文ですが、Invoke code内のループでは試してなかったです。
ForEachRowアクティビティを使っていました。

アクティビティでのループは個々のアクティビティによるオーバーヘッドが生じるため、
繰り返し回数が多ければ、パフォーマンス的には不利になります。
Invoke Code内でしたらこのオーバーヘッドは生じませんので、それなりに高速に動作すると
思います。(=単に高速化を目的とするなら、LINQをつかう必要もないかもしれません)

dt側に反映されていました。
また、お教えいただいたコードで回した結果(dt)と、
元のコードで回した結果(dt)をExcelに出力して確認しましたが、
内容に差異はありませんでした。
ふつうは反映されないものなのだとしたら、
どこか書き方がおかしいのかもしれませんね;

そうなのですね!勉強になります!!

1 Like

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