Excelファイル大量データのマージ処理

システムより50万件近くのデータを下記方法で抽出しexcelに取り込みました。
日付2017/04/01が次のようになってしまいます。
04/01/2017 00:00:00

処理:
1 50万件のデータ抽出を仮定して、処理を数十回に分割してdo whileでマスターより個々の期間を取り込みexcelにフォルダを指定して保存
2 数十個のexcelファイルが所定のフォルダに順次保存されてゆく
3 assgin: list = Directory.Getfiles(フォルダ名)
Build data tableでマージ用のデータテーブルを作成(項目指定なし) DT01とする。
list = Directory.Getfiles(フォルダ名)で取得したファイルを順次Excel application scopeで読み込み別のデータテーブルに保存 DT02とする。
Merge data tableで
destination DT01 add source DT02
DT01 = DT01 + DT02とした。

4 これをexcelにWrite rangeで保存しようとしましたが何度行ってもexcelが異常終了するので、
CSV形式 Write CSVで保存した。

5 CSVファイルを確認すると日付2017/04/01が04/01/2017 00:00:00また時刻も23:04:48が0.96166666666667となってしまいます。

対応方法に関してご教示いただければと思います。

@matrix99999

実際のファイルがわからないので、確実なことは言えないですが、気になるところは以下の2点です。

  1. 5で日付が書き換わったのはExcel <> Uipath間の書式の問題だと思うので、可能であれば一度同様の操作を手動でやってみて、最終的なCSVのフォーマットがどうなるか確認するのはどうでしょうか?
    0.96166666666667はExcelに張り付けて、時刻書式にすると、多分適切な時刻になる気がします。

  2. Excelが強制終了する話ですが、Excel のバージョンっていくつですか?2003とか古いバージョンだと、行数の制限が65536行なので落ちる場合があります。また、どこで読んだか忘れましたが、行数が多すぎて処理が失敗した、、、みたいなフォーラムのポストを見た記憶があります。(これは結局Excel のバージョンの問題だった気もしますが。。。)

情報共有まで。

1 Like

ありがとうございます。

1のアドバイスに関して、時刻に関してexcelの書式設定を変更することで対応できました。
しかし、日付に関してはexcelの色々書式設定を変更してみましたが、csvの状態、04/01/2017 00:00:00でした。

2 excelのバージョンは2010です。
1ファイルあたりの件数を2000件また10000件にして取り込めるexcelが何ファイルできるか試してみました。
8ファイルあるいは9ファイル目でexcelが強制終了してしまう動きをします。
PCは32bit メモリ 4Gb windows 7 proで検証しました。
officeは、2016、PCに関しても64bit メモリ 8gbにする予定ですがスペックをあげれば解消できるのかは先になりそうです。

@matrix99999 さん

多分ですが、1の日付については、datatable内で日付型で読み込まれているため、求めている書式からシステムが持つ標準の書式に読み変わっているんでしょうね。ご存知かもしれませんが、下URLのように出力書式を変更することは可能です。

また、2については8 もしくは 9ファイル目で落ちるとのことなので、そこがブレるということはメモリの可能性が高いかもですね。
メモリ増設以外にこれを確認したいのであれば、適当に重いプログラムを立ち上げて、ロボットを再実行して、例えば4ファイル目とかで落ちるのであれば、さらにその仮説を支持する結果である気がしますね。
また、メモリが原因の場合は、(やったことない&やっていいか知りませんが)ループ処理内で、適当なツールを使ってメモリ開放を入れ込むとかのアプローチが考えられます。

FYI位の話ですが。

ありがとうございます。

データテーブルの型変換に関しては、下記のことを試しました。
問題のある、日付と時刻のみデータマージしてどうなるかを行いました。
dt01 = dt01 + dt02
の関係でデータテーブルをマージしていくことから、
dt01のデータベーステーブルをBuild data tableで型をdatetimeにしてテストしました。
dt02は加算対象となるexcelのデータベース名です。
結果は下記のように型が合わないということでエラーとなります。
Merge data table: .日付 and .日付 have conflicting properties: DataType property mismatch.

型のタイプをstringにしてみたりして試しましたが結果は一緒でした。

データテーブル単位でマージする方法を行っていますので足しこまれる(出力)される列の型を教えて頂いたように型変換すべきか分かりません。

1行単位で考えていかなければならないのか合理的な方法があればご教示いただければと思います。

データマージ処理のやり方を変えました。

1assgin: list = Directory.Getfiles(フォルダ名)でファイル一覧を取得
2count =1
3excel application scopeでマージするexcelを指定
4each for row で順次listの内容をループ
4read rangeでlistのexcelを読み込む(DT01)
5DT01の件数取得
6write range:excel application scopeで開いたexcelに書き込む
書き込む行を計算してeach for row が抜けるまで書き込んでゆく
countに読み込んだ値と加算した値を足しこみました。

merge datatableの利用はやめました。

書き込み用のexcelを開いた状態で順次、各excelをどの行に貼り付けるか
行の値を算出して行いました。
結果として途中でexcelが落ちることはなくなりました。
またexcelを利用することで日付も問題なくdate型で表示できました。

50万件のデータに関してもこのやり方で考えています。
メモリの解放の方法も組み入れていきたいと考えていますがもしご教示いただければ幸甚です。