- ベストアンサー
VBAで大量のテキストファイル結合ができない
- VBAを使用して大量のテキストファイルを結合しようとすると、一定量までは結合されるが、その後は途中で停止してしまいます。
- 結合するファイルはすべて3行で、文字数は約300です。
- コマンドプロンプトの黒い画面が表示され、結合ファイル(out.txt)を確認すると、途中まで結合されています。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
以下の制限に引っかかっているのではないでしょうか? コマンド プロンプト (Cmd. exe) コマンド ライン文字列の制限 https://learn.microsoft.com/ja-jp/troubleshoot/windows-client/shell-experience/command-line-string-limitation
その他の回答 (5)
- chie65536(@chie65535)
- ベストアンサー率44% (8802/19961)
因みに。 他の回答にある通り TYPE .\TEMP\*.TXT >> .\OUT.TXT というコマンドでも同様の事が行えます。 しかし「OUT.TXTが大きくなったり、ファイルの数が多くなると、時間が掛かるようになる」のは変わらないので、問題は解決しません。 「黒いDOS窓が出て待たされる」のは一緒です。
お礼
chie65535さん いろいろな方法があるのですね。 参考になりました。 今後ともよろしくお願いいたします。
- chie65536(@chie65535)
- ベストアンサー率44% (8802/19961)
>ある一定量のファイルまでは期待通り結合されるのですが、 >それを超えると途中でコマンドプロンプトの黒い画面が出て止まってしまいます。 それで正常です。 COPYコマンドで「COPY .\TEMP\*.TXT .\OUT.TXT」という形式でファイル結合を行うと、ある段階で、異常に時間が掛かるようになり、黒いDOS画面が出たまま待たされます。 一瞬で終わるうちは、黒いDOS画面が表示される前に終了するので、黒いDOS画面は見えませんが、表示される前に閉じられているだけなので、黒いDOS画面は開かれているのです。 で、結合を行う場合、COPYコマンドは「OUT.TXTを開いて、OUT.TXTのファイル末尾に移動。*.TXTの1つを開いて、中身を読んで、読んだ内容をOUT.TXTに追加モードで書き込んで、*.TXTとOUT.TXTを閉じる」という動作を、*.TXTで見つかったファイル数の分だけ、繰り返します。 この時、OUT.TXTが「ある程度の大きさを超える」と「OUT.TXTのファイル末尾に移動」と言う処理に、時間がかかるようになります。 かかる時間は、結合ファイルのファイル数をn、単位時間をtとすると 所要時間=t(n(n+1)÷2) の式で計算されます。 tを0.1秒、nを70個と仮定すると、所要時間は240秒以上(4分以上)になります。 そうなると「黒いDOS画面が表示されて、4分待たされる」事になります。 nを140にすると17分、210にすると37分、のように、指数関数的に時間が伸びて行きます。 DOS窓を開いて、COPYコマンドを手入力してみると「ずっと待たされ、フリーズしたみたいになり、忘れた頃に終わる」ので、時間が掛かるのを体感できます。 COPYコマンドを使うと、ファイル数が増えた時に死ぬほど時間が掛かるようになるので、「自分でファイルをオープンする」「自分でReadLineで1行読む」「自分でWriteLineで1行書く」などで、COPYコマンドと同等の処理を「自分でVBAで記述」して下さい。
お礼
chie65535さん 詳しいご説明ありがとうございました。 勉強させていただきます。
- maiko0318
- ベストアンサー率21% (1483/6969)
というか type A >> B で追加できますよ。(テキストファイルなら)
お礼
maiko0318さん 勉強になりました。 ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17070)
下記の疑問を感じた。 VBAで、「テキストファイルを結合したい」なら、質問のやり方でなく、他の方法でやれそうです。 小生は、Windows Scriptなどに、詳しくない、経験がない、せいもありますが、なぜ質問のやり方を取るのか不思議。 小生ならVBAの兄弟のVBSCRIPTのFSOのテキストファイルの処理機能を使うことを考えます。 原初(昔)のBASICのファイル処理コードと、同じようなコードですむし(単純だ)。 >結合 どういうことをやりたいのですか? SQLで言う結合ではないですよね。こういう難しい・背景のある言葉は、安易に使わないこと。 使う場合は説明を加えること。 ただ1つのファイルにまとめたいだけではないのか? レコードの、データ項目の合成とかあるのか? >大量の だいたい、どのぐらいの桁の数か、読者は知りたいのでは?「大量」ということが、原因として疑われる、こういう質問では、注記するのが当たろ前では?。
お礼
imogasiさん ありがとうございます。 VBSCRIPTのFSOのテキストファイルの処理機能で期待どおりの結果を出すことができました。 勉強になりました。 今後ともよろしくお願いいたします。
- m5048172715
- ベストアンサー率16% (860/5261)
仕様だな。 文字列に特殊な記号が入っていると、動きはおかしくなる。
お礼
m5048172715さん 早々のご対応ありがとうございます。 特殊な記号が入っていないか確認してみます。
お礼
redslove10さん ご対応、ありがとうございます。 文字数制限があるのですね。 回避策を考えたいと思います。