Datatableのテータ取得方法

元データ(Excel)をdatatable変数(dtNumber)に格納し特定の行から特定の行までのデータを取得したいのですが、どのような方法があるのでしょうか。

具体的には、A列とB列にデータがあり、B列のデータを取得したく、B列には4900程数値が入っています。ただし、1000データずつ取得したく、1~1000を抽出、次は1001~2000までを抽出・・・のようにしたいです。

フローの設計としては、(dtNumber)をデータテーブルをフィルターにてB列のみに変更。データ抽出をおこない、取得したデータが変数に入っている場合は後続処理、無い(Null)の場合は作業をブレークする といった流れを想定しています。

datatableから1~1000行までの数値を抽出する という部分がわからず、ご教示頂けると有難いです。

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

こんにちは

以下に同様要件のサンプルがあるので、参照下さい

@Yoichi

回答ありがとうございます。

サンプルを参考に自身のフローの変数に置き換えたところ、エラーが発生しました。
変数の型などサンプルと同様であること確認したのですが、どこが誤っているか教えていただけないでしょうか?

このxamlファイルは新規に作成したものでしょうか?
過去バージョンでこの問題が出るものがありますので下記postの様に修正するか、新たにxsmlファイルを新規作成してどうなるか確認してみてはと思います。

dt.rows(i).item(j)
とかで値が取得できると思うのですけど、それでループ処理させるじゃダメなんでしょうか?

@minami

返答ありがとうございます。
その様にしてデータ取得できること理解はしているのですが、今回は約5000行データある中、1000行ずつ取得してべつファイルに貼り付けたいので、データテーブルの操作で一度に1000行ずつ取得する方法があるかと思い、相談させて頂きました。

もし、方法ご存じでしたら教えて頂けると有難いです。

@Yoichi

新規で.xaml作成すると上記エラーは解消されました。
しかし、頂いたサンプルを確認すると 対応OSが Windows となっており、自身が使用しているOSとしては Windows-レガシになるので、そのまま使用すること(参考にすること)が出来ませんでした。対応OSがWindowsを推奨されていることも理解してるのですが、自身の所属する組織においてはレガシとしており、変換することも難しい現状です。

そのほかの方法を教えて頂けますと幸いです。

宜しくお願い致します。

こんにちは

上記で共有したサンプルはWindows-レガシーです。もしWindowsになっているようであれば、Windowsに変換してしまったのではないでしょうか?

データテーブルの操作で一度に1000行ずつ取得する方法があるかと思い

いくつか案はありますが、

範囲読み込みで範囲を動的に1000件ずつ取るように変更する。

上記のサンプルのように、dt.AsEnumerable.Skip(n).Take(1000).CopyToDataTable
でDataTable中の必要な範囲を抽出する

あたりではないでしょうか?

返答ありがとうございます。

範囲の読み込みで動的に1000件ずつ取得する という部分について技術的にどのように開発すると良いか教示頂いても宜しいでしょうか。
考えてみたのですが、範囲にどうやって変数を設定するとよいか、どのようなループにするとよいかわからず、お手数ですが、お願い致します。

こんにちは

例えば以下のようにします。

"A"+(2+currentItem*1000).ToString+":M"+(1001+currentItem*1000).ToString

この場合ヘッダ情報が取得できませんので、ヘッダなしで読み込んでインデックス番号で指定するか、もしカラム名が必要なら別でカラム名を設定する必要があります。

全件を1000件ずつ取得するような二重ループにするだけだと思うのですがそれではだめだってことなんでしょうか?

返答ありがとうございます。

>全件を1000件ずつ取得するような二重ループにする

自身の知識不足・実力不足に尽きるのですが、上記の点そのようにしたいと思いながら、具体的な実現方法(どのようなフローにするか)が分からず質問させて頂きました。

お手数ですが、どのようなActivityを使用し、どのようなフローにすると実現できるか、ご教示頂けると大変有難く、お願い致します。

開始カウンタ=1
終了カウンタ=1
全件カウンタ=全体件数
ループ1の開始
終了カウンタ+1000が全件カウンタを超えるか?
超えていたら終了カウンタ=全件カウンタ+1
超えていないなら終了件数カウンタ=終了カウンタ+1000
ループ2の開始(開始カウンタから終了カウンタまで)
データテーブルの毎行処理(ループカウンタをインデックスとして使う)
ループ2に戻る
終了カウンタ>全件カウンタか?
そうでなければ開始カウンタ=終了カウンタ+1にしてループ1に戻る
終了

みたいにできると思いますが・・普通にロジック組むだけかと・・
使うアクティビティは繰り返しとIFと代入くらいです。
もっとスマートなロジックも作れるでしょうし、ほかの方が提示しているように全く違うアプローチもあると思います。
(ちゃんと検証したわけではないので、実際にロジック組む時は動作検証ながら組んでください)