LINQで抽出したデータの元データに書き込む方法

やりたいこと

以下の構文で抽出したデータがあります。

dt.AsEnumerable.Where(Function(r) r("flg").ToString="")

上記で抽出したデータの処理が終わったらflg=1とし、最後にcsvに書き込みを行うのですが、これを最後ではなく随時処理が終わるごとに書き込みたいです。
途中でエラーで止まってしまった場合に、再実行する際処理済みを表す「1」が立っていないと意味がないためです。

上記を実現する方法がありましたら、ご教示ください。

こんにちは

いくつか方法あると思いますが、例えば

dict = dt.AsEnumerable.Where(Function(r) r("flg").ToString="").ToDictionary(Function(r) dt.Rows.IndexOf(r),Function(r) r)

dict はDictionary<int32,DataRow>

としておいてdictをイテレートすれば、keyとして当該行のrowindexが得られますので、
その情報をもとにDataTableに書き込めば良いかと思います。

1 Like

抽出したデータの繰り返しの中で、さらに上記のdictを繰り返すのでしょうか?
それとも、抽出したデータの繰り返しのコレクション自体を、上記の構文に書き換えるのでしょうか?

この場合は、後者になります。上記dict自体が、whereで抽出した値を持っていますので、多重にする必要ありません。

dict = dt.AsEnumerable.Where(Function(r) r("flg").ToString="").ToDictionary(Function(r) dt.Rows.IndexOf(r),Function(r) r)

を予めしておき、コレクションの要素繰り返しで
dict.Keysをコレクションに指定するということですね。

これまでは、row(列名).tostringでデータを取得していましたが、itemではどのように列の各行の値を取得できますでしょうか?

こんにちは

その方法もありますが、DictionaryはIEnumerable<KeyValuePair<TKey,TValue>>を実装しているので、コレクションはdictとして、TypeArgumentはKeyValuePair<Int32,DataRow>を指定する方が直接的です。

これまでは、row(列名).tostringでデータを取得していましたが、itemではどのように列の各行の値を取得できますでしょうか?

KeyValuePairで指定しておけば、item.Value でDataRowが返ります。
ので値を文字列型で取得したいのであれば、 item.Value("列名").ToString()になります。

1 Like

このような方法があるのですね。
dict.Keysの場合は「dict(item)」でKeyの値を取得できる認識ですが、この記述方法の場合はどのようにしてKeyの値を取得するのでしょうか?
一から百まで質問してしまいすみません。

※追記
すべてを一行で書き込もうとしていたために変なエラーが出ていたようです。
dict.Key.Tostringで取得できました。ありがとうございます!

度々すみません。

この部分なのですが、元のデータテーブルはcsvを参照しており、フラグをcsv側に書き込みたいです。
処理途中にcsvの該当行に書き込む方法はあるのでしょうか?
Excelであればイメージができるのですが、そもそもcsvに行の概念があるのか?ということが気になります。
データテーブル上に書き込んだものを、都度可視化するにはどうすれば良いでしょうか。

こんにちは

基本的にはCSVファイルへの書き込みは全体を書き込むことになります。エクセルで実現する場合も
ワークブック単位でしかファイルには書き込めませんので、ファイル書き込みについてはほぼ同じかと思います。

Excelが使えれば、繰り返しの最後にセルに書き込みを入れて該当行に処理済みのフラグを立てることができますが、csv形式のデータで同様のことができればと思いトピックを立てさせていただきましたが、それはできないということで理解しました。
ありがとうございます。

CSVを使う場合はDataTableがそれを担うと考えれば良いかと思います。DataTableの当該行に
フラグを記録して、それをファイルに保存する必要がある場合はCSV全体を書き戻します。

すみません。csvに書き込み自体を勘違いしておりました。
csvに書き込みを繰り返し内に配置すればその時点でのデータテーブルの状態で書き込むことができますよね。
(処理した時点までのデータで上書きになりエラーになったデータ以降は書き込まれないと思い込んでしまっていました。)

はい、その理解で問題ないと思います。
ちなみにになりますが、エクセルでもCSVでも同じなのですが、ファイルサイズがかなり
大きい場合は、ファイルの書き込みにより処理全体のスループット低下が顕著になります。
そのような場合は、同じエクセルやCSVに書き戻すのが良いか等も含めて検討する必要が
あります。

1 Like

毎日200件ほどのデータが増えていくため、このような問題は今後起こりそうです。
過去の不要なデータを手動で削除する以外に何か対策はありますでしょうか?

繰り返し処理前に、既に1になったデータは別のファイルに吐き出し、処理対象だけを残すなども有効でしょうか。(この場合は常に最大でも200件ほどのため、ファイルサイズは小さくなりそうです。)

こんにちは

業務要件次第ですので、一概には言えませんが、例えばファイルを日次や週次にすることや、データの単純再投入が可能であれば書き込み頻度を下げる等が考えられるかと思います。

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