• ベストアンサー

VBSを使用し、指定フォルダ内のテキストファイルを一つに結合させたい

お世話になります。 引数1=結合したいテキストファイルの存在するフォルダパス("Y:\Work") 引数2=結合後のテキストファイルのフルパス("Y:\Temp\Merge_All.csv") を引き渡し、 引数1で指定したフォルダ内に存在する、 拡張子"dat"の複数ファイルを一つに結合する共通モジュール を作成したいと思っています。 下記モジュールをメインモジュールから何度か呼び出しているのですが、 一度目は問題なく実行されるのですが、 二度目に実行する場合に、 Set oTextFile = oFs.OpenTextFile(sFilename, 1)の行で エラー メッセージ "Runtime Error! Abnormal Program Termination." が表示され処理が中断してしまい困っています。 お気づきの問題点がございましたら、是非お時間のある時にご指導いただけると幸いです。 ヒントでもかまいませんので、よろしくお願いいたします。 ついでといってはなんですが、、、 本来はヘッダー付ファイルを先頭ファイルのヘッダーだけを残して 一つに結合したいと思っていたのですが、 ファイルサイズが膨大なため、ReadLineでは遅すぎてあきらめ、 ヘッダーなしファイルをReadAllで単純結合していく方法にしました。 ヘッダー付ファイルを結合する良い方法をご存知の場合は、 是非合わせてご教授お願いいたします。 Sub MergeFiles(sFolderPath, sExpFilePath)  Const ForReading = 1  Set oFolder = oFS.GetFolder(sFolderPath)  Set oExpFile = oFS.CreateTextFile(sExpFilePath)  For Each sFilename In oFolder.Files    sFileExtension = oFS.GetExtensionName(sFilename)    If LCase(sFileExtension) = "dat" Then      Set oTextFile = oFS.OpenTextFile(sFilename, ForReading) ←二度目のここでエラーなんです      sExpLine = oTextFile.ReadAll      oTextFile.Close      oExpFile.WriteLine sExpLine    End If  Next  oExpFile.Close End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • tkrn
  • ベストアンサー率53% (33/62)
回答No.3

#2です。 > に改行コードがあるために結合部に一行の空行が入ってしまいます。 もしかして、 oExpFile.WriteLine を使われていますか? これは自動的に改行されてしまいます。 oExpFile.Write を使用してみてはどうでしょうか?

noname#44485
質問者

お礼

素敵です!tkrnさん! ばっちりですーーー!! あやうく(またしても?)「何やってんだかコード」を書き残してしまうとこでした。 また、お世話になることもあろうかと思いますが、 ボケ質問なこれに懲りずお力をお貸しください。 的確、かつ早いご回答本当にありがとうございました。

その他の回答 (2)

  • tkrn
  • ベストアンサー率53% (33/62)
回答No.2

> Marge_diff.datに統合し、 > 二度目で > 既に存在しているMarge_fixed.dat > と上記のMarge_diff.dat > を統合し、 > Marge_all.datを生成 単に処理のタイミングが早すぎるだけのようなな気がします。 Timerかなにかで2度目の処理を一旦スリープしてから開始してみてはどうでしょうか?

noname#44485
質問者

お礼

おはようございます。 ご回答ありがとうございます。 個別に実行してみましたら、 二度目(一度めの生成ファイル使用)だけにエラーが発生し、 一度目のファイルのコピーで実行するとエラーが発生せず、 どうやらファイルデータがおかしそうな感じです。 質問前に個別に実行するという問題の切り分けをしてから、 お聞きすればよかったのに、 ループが、ループが、、、と早とちりして、思いいたりませんでした。 せっかくご回答いただいたのに申し訳ありませんでした。 上記の質問とは違うのですが、 ファイルを結合する場合に 末尾に改行コードがあるために結合部に一行の空行が入ってしまいます。 末尾改行コードを除去するモジュールを足したいのですが、 末尾を改行コードを判定する方法をご存知ないでしょうか? sExpLine = oTextFile.ReadAll If Right(sExpLine, 2)= chr(13) & chr(10) then   sExpLine = Left(sExpLine, Len(sExpLine) - 2) End if とやってみたのですが、 判定していないようで、IFの中に入りません。。。 本来なら別に質問をたてなくてはならないようなことですし、 もしもお時間があればついでの時にでもご回答いただければ幸いです。

回答No.1

私の所ではファイルが小さいためか現象が出ませんでした。 外れているかもしれませんがオブジェクトを明示して解放してみたらどうでしょうか。 oTextFile.Closeの次辺りに「Set oTextFile = Nothing」を入れてみるとか。 また、oFSは「Set oFS = WScript.CreateObject("Scripting.FileSystemObject")」で定義しているのですよね? これも「MergeFiles」の最初で定義して、最後にNothingで解放してみたらどうでしょう。 再現しないため勝手な思い込みで書いているので参考にならないかもしれません。ご容赦下さい。

noname#44485
質問者

お礼

ご親切にテストまでしていただいて、本当にありがとうございます。 コード漏れがありすみません、ご指摘のとおりoFsは上位でSetしております。 そうなんです。 Set oTextFile = Nothing Set oExpFile= Nothing 苦肉の策でいろいろ解放してみたのですが、現象が変わらなくて。。。 一度目で 月ごとのデータファイル 200703.dat 200704.dat 200705.dat をMarge_diff.datに統合し、 二度目で 既に存在しているMarge_fixed.dat と上記のMarge_diff.dat を統合し、 Marge_all.datを生成 というような使い方をしているのですが、 一度目での統合の仕方が悪く変なファイルを作っているのかもしれません。 お忙しい中お時間をいただきまして、本当に感謝です。 また何か思いつくことがありましたら、是非よろしくお願いいたします。

関連するQ&A