Dt①から新しいdt②へデータを転記したい

UiPath初心者です。
現在のdt①には数値の列があるため、計算が出来ないので、
1.データテーブルを構築・・・dt②
2.データをdt①からdt②へ転記 を希望しております。
データ量が多いので、繰り返しではなく、invoke code で行うのかな?と思い、
以下の形で書きましたが、
dt①とdt②の指定の仕方等 書き方が分かりませんでした。

教えて頂きたく、よろしくお願いいたします。

image

image

Hi @miwa_yamamoto

Please try this,

Main.xaml (7.1 KB)

dtTable.AsEnumerable.Sum(function(x) cint(x(“Column1”).ToString)).ToString

image

image

image

Thanks

1 Like

ありがとうございます。

今回は、データ量が37万行ほどあるので、
繰り返し各行が使えそうにありません。
折角教えて頂いたのですが、こちらは繰り返し各行で使うもの??と思ったのですが、
データ量の多いものに対して他の方法でこの式が使えるのでしょうか。
あまり知識がないため、申し訳ございません。

@miwa_yamamoto I have tried for 475000 and its working fine, yes it will sum all the values in a particular column, correct me if iam moving away from your requirement…

Thanks

1 Like

こんにちは

1.データテーブルを構築・・・dt②

dt2を新たに構築するのであれば、代入アクティビティで

dt2 = dt1.Copy

でまるっと複製できますので、こちらをベースにする方が良いかもしれません。

空のデータテーブルにデータ行を追加するには、AddRow等のメソッドが必要になります。

いつもありがとうございます。

代入でそんな便利なことが出来るのですね。
大変勉強になります!!
使用する際について、2点、教えて下さい。

1.元のdt①がstring型の列で、dt②を構築する際、int32型にした列では、
出来上がったdt②ではint32型になっていますか。

2.dt①とdt②では列タイトルは同じである必要はありますか。
それとも、列の並びを同じにしておけば、左から順にコピーしていってもらえるのでしょうか。

ご面倒をお掛けしますがよろしくお願いいたします。

こんにちは

dt2 = dt1.Copy

上記の方法は、データテーブル全体の複製しかできません。
そのため、dt2のDataTableスキーマを予め定義する必要はなく、仮に作っても
dt1と同じものしか作れません。
目的を明確にいただくと、他のアプローチ含めコメントできるかもしれません。

ありがとうございます。
なるほど、そうなのですね。

csvデータを読み込んだdt①の中に数値(小数・整数)の列が複数あり、
その列を使い、計算をしようと思っております。
計算をするためには、数値型にしないと出来ないと思い、
dt②を構築し、列をint型などで指定し、そこへデータをコピーしようとしおりました。

ご面倒をお掛けしますが、方法を教えて頂きたくよろしくお願いいたします。

こんにちは

DataTable.Computeメソッドで計算するために、数値型の列にするということでしょうか?
それも一つの方法と思いますが、LINQのメソッドを使うと、列の型によらず、明示的に変換式を
使うと、各種演算が可能ですので、そちらの方がスマートかもしれません。
「計算」とは合計等でしょうか?

ありがとうございます。

DataTable.Computeメソッドや 四則演算全ての為に数値列にしようと思っておりました。

列の型によらず、計算できる方法があるのですか。
とても便利ですね。

列①/列②=列③
列③x列④=列⑤
列⑤の合計を取得

途中を見せる為、あえて一度に計算はしていません。

ご面倒をお掛けしますが計算方法を教えて頂きたくよろしくお願いいたします。

こんにちは

この要件があるなら、DataTableを作らねばなりませんね。

以下お試しください

1.Filter DataTableアクティビティで元のDataTableから、列1、列2、列4を抜き出し。
2.Add DataColumnアクティビティで列3と列5を追加(この段階で、列1、列2、列4、列3、列5の順のテーブルになっています)
3. 以下の式を使ってDataTableを出力

dt.AsEnumerable.Select(Function(r) dt.Clone.LoadDataRow({r("Column1"),r("Column2"),r("Column4"),Double.Parse(r("Column1").ToString)/ Double.Parse(r("Column2").ToString),Double.Parse(r("Column4").ToString)* Double.Parse(r("Column1").ToString)/ Double.Parse(r("Column2").ToString) },False)).CopyToDataTable

4.以下の式で列5の合計を算出。

dt.AsEnumerable.Sum(Function(r) Double.Parse(r("Column5").ToString))

ありがとうございます。

一度計算が必要な部分のみ取り出して計算をすると言うことですね。
こちらは、計算結果が自動的に列3 に入ってくれると言うことですか。

またこちらを元の表に戻す際は、どのようにすれば良いですか。
後でキーになる言葉も、1、のフィルター時に 抜き出し、
データテーブルの結合になりますか?

こんにちは

元のDataTableに書き込みたいのであれば、別のDataTableに書き出す必要はありません。
直接上記の3の式を適用することになります。
ただしLoadDataRowの部分ですべての列を列挙する必要があるので
列数が多い場合は、別の式の方が良いかもしれません。

ありがとうございます。
元のdt① は14列x37万行 となっております。
この中の一部の列が数値となっており、その中で 四則計算をしたいと思っておりました。
最終的に、dt①の状態をそのままExcelにする必要があります。

このような場合、どう対処したら良いでしょうか。
説明不足で申し訳ございません。

こんにちは

上記の式で中かっこで囲まれた部分がありますが、
変更したくない列はそのまま r("列名") のように、
演算したい場合は、 Double.Parse(r("列名").ToString) のような形で演算式を
14列分記載すればOKです。

おはようございます。
確認が遅くなり申し訳ございません。
なるほどです!
大変勉強になります!!

早速今から挑戦します!!