• ベストアンサー

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

noname#44485
noname#44485

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

  • ベストアンサー
  • 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

  • ファイル結合について

    .vbsを使用して複数のテキストファイルを1つのテキストファイルに結合したいと思っております。 条件として対象ファイルが0KB及びない場合には追記しない。 結合部分に関しては下記で追記することができたのですが 条件部分に関してはFilelen?を使用するとファイルサイズを取得できるみたいなのですが 実際の記述がわかりませんでした。 ご教授頂けると助かります。 ■追記部分 Set logFile = fso.GetFile(logFile) Set f = logFile.OpenAsTextStream(8, -2) Set objFS = CreateObject("Scripting.FileSystemObject") Set objText = objFS.OpenTextFile(srcFile) myText = objText.ReadAll 'ExecDateTime = Now f.Write(myText & vbNewLine) f.close '解放 Set f = Nothing Set logFile = Nothing Set fso = Nothing

  • VBAでのフォルダ指定方法について

    EXCELファイルが保存されているディレクトリ配下のフォルダーを指定できるようにしたくていろいろ試してみたのですが、うまくいきません。 どなたか、お知恵をお貸しください。 以下ソースです。 Private Sub CommandButton1_Click() Dim ShellApp As Object Dim oFolder As Object Dim MyPath As String MyPath = ActiveWorkbook.Path Set ShellApp = CreateObject("Shell.Application") Set oFolder = ShellApp.BrowseForFolder(0, "処理ファイルの格納フォルダ選択", 1, MyPath) If Not oFolder Is Nothing Then TextBox1.Value = oFolder.Items.Item.Path End If Set ShellApp = Nothing Set oFolder = Nothing End Sub

  • VBSで指定したフォルダー内のファイルを書き出さないようにする

    あるフォルダ以下のファイル名を出力ファイル、f.name.txtに書き出すのですが "新しいフォルダ"というフォルダのなかにあるファイルは書き出さないようにしたいのですが、意に反してフォルダー内の全てのファイル名を書き出してしまいます。どこがおかしいのでしょう? ********************************************** Set FSO = CreateObject("Scripting.FileSystemObject") Set fl = WScript.CreateObject("Scripting.FileSystemObject") Set abc = fl.CreateTextFile("f.name.txt") ShowSubfolders FSO.GetFolder(".") Sub ShowSubFolders(Folder) For Each File in Folder.Files 'Folder内のファイルを列挙する Fname = File.name FolderCheck=Folder & "\" & "新しいフォルダ" If Folder <> FolderCheck Then abc.Write Folder & "\" & Fname & vbCrLf End If Next For Each Subfolder in Folder.SubFolders 'Foler内のフォルダを列挙する ShowSubFolders Subfolder '再帰呼び出し Next End Sub abc.Close

  • VBScriptのOpenTextFileメソッドのようなことをJavaScriptで行いたい

    VBScriptの指定されたファイルを開き、ファイルを読み込んだりするOpenTextFileメソッドのようなことを JavaScriptを用いて行いたいんですがどのようにすればいいんでしょうか? できれば、以下ソースと対比したソースを張っていただけるとありがたいです。よろしくお願いします。 Sub OpenTextFileTest Const ForReading = 1, ForWriting = 2, ForAppending = 3 Dim fs, f Set fs = CreateObject("Scripting.FileSystemObject") Set f = fs.OpenTextFile("c:\testfile.txt", ForAppending,TristateFalse) f.Write "Hello world!" f.Close End Sub

  • VBSでテキストファイルを作成

    こんにちは。 set fso = createobject("Scripting.FileSystemObject") fso.createfolder("倉庫") を実行すると、実行したスクリプトが存在する場所に「倉庫」という名のフォルダが作成されます。 その倉庫というフォルダの中にテキストファイルを作成するにはどうすればよいでしょうか? set fso = createobject("Scripting.FileSystemObject") fso.createfolder("倉庫") set fo = fso.opentextfile(FILENAME) close.fo 相対的にファイルの場所を指定する方法がわかりません。 絶対パスでないとだめなのでしょうか?

  • VB6.0にて、CSVファイルを読み込もうとしているのですが、1行ずつ

    VB6.0にて、CSVファイルを読み込もうとしているのですが、1行ずつ読み込めません。 以下のコードで、Lineのメッセージボックスが表示されないのです。 どなたか教えていただけないでしょうか。よろしくお願いします。 'CSVファイル読み込み Sub Stream() Dim Line, Temp As Variant Dim objFSO As Object Dim objStream As Object Const ForReading = 1, ForWriting = 2, ForAppending = 3 Set objFSO = CreateObject("Scripting.FileSystemObject") Set objStream = objFSO.OpenTextFile(strDFpath & strDFname(1), ForReading, False) Temp = objStream.ReadAll MsgBox Temp '最後の行までループ Do Until objStream.AtEndOfLine - 1 <> True '1行読む Line = objStream.ReadLine MsgBox Line Loop objStream.Close Set objStream = Nothing Set objFSO = Nothing End Sub

  • VBSを使用してXMLファイルの不要行を削除を行いたい

    お世話になります。 表題の件先に進まず困っておりお力を貸して頂けますでしょうか。 OSより出力されたXMLファイルに不要箇所があり、 その不要箇所をVBSを使用して削除し成形し直す事を行っております。 XMLファイルをVBSでテキストと読み取り不要箇所を検索し削除と思ったのですが、思うようにいきません。 該当箇所の先頭からの文字数を検索し、その前後を抜き出して 成形しなおそうとしたのですが、検索が出来ませんでした。 【検索VBS】 Const ForReading = 1 startxml = "<Parameters>" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("Test01.xml", ForReading) Wscript.Echo InStr(strCharacters,startxml) 【読み込みファイル】 添付します 【結果】 0 【不要箇所】 <Parameters>から</Parameters>までです。 よろしくお願いします。

  • 再度:VBSで指定したフォルダー内のファイルを書き出さないようにする

    先ほども似たような質問をしました。 あるフォルダの中にあるファイル名の一覧をファイル"f.name.txt"を書き出したいのですが"新しいフォルダ"のなかにあるファイルは書き出さないようにしたいです。下記のVBSは"新しいフォルダ"のなかに更にフォルダが階層的に存在するときには"新しいフォルダ"の中のファイルも全て書き出してしまいます。 "新しいフォルダ"の中にフォルダがない場合は正しく動きます。 "新しいフォルダ"の中にフォルダが階層的にあっても"新しいフォルダ" の中にあるファイル名を書き出さないようにするにはどうしたらよいのでしょう? ************************************************************** Set FSO = CreateObject("Scripting.FileSystemObject") Set fl = WScript.CreateObject("Scripting.FileSystemObject") Set abc = fl.CreateTextFile("f.name.txt") ShowSubfolders FSO.GetFolder(".") Sub ShowSubFolders(Folder) If Folder.Name <> "新しいフォルダ" Then For Each File in Folder.Files 'Folder内のファイルを列挙する Fname = File.name abc.Write Folder & "\" & Fname & vbCrLf Next End If For Each Subfolder in Folder.SubFolders 'Folder内のフォルダを列挙する ShowSubFolders Subfolder '再帰呼び出し Next End Sub abc.Close

  • 正規表現でテキストの中身を置換したい(VBS)

    初心者で、もしかしたらすっごく恥ずかしい事を聞いているかも知れませんが・・・ テキストファイルの中を正規表現を使って検索し、指定(固定)文字列と置換したいのですが、どうもうまく行きません。 ソースは以下のような物です。 ----- Set FS = CreateObject("Scripting.FileSystemObject") Set ts=Fs.OpenTextFile("C:\Program Files\ABC\EFG.txt",1) myStr=ts.ReadAll repStr = "NG_PATH =D:\ABC\HIJ" Set objRE = New RegExp objRE.Pattern = "^NG_PATH.*=C:\\Program\sFiles\\ABC\\HIJ" objRE.IgnoreCase = True objRE.Global = True newStr = objRE.Replace(myStr,repStr) ts.Close Set ts = FS.OpenTextFile("C:\Program Files\ABC\EFG.txt",2) ts.Write newStr ts.Close ------- ●ポケットリファレンスの内容を見て、組み合わせながら作っています ^_^; ●置換対象ファイルの中をobjRE.Patternで指定している内容で検索すると見つかります。 ●置換対象ファイルの更新日時を確認すると、VBS実行時間で更新されています。 それから「myStr」や「newStr」は、任意の変数を宣言して、そっちを使う事って出来ますか?

  • VBscriptで「改行」と「"」を置換させる

    VBスクリプトを使ってファイルを置換したいと考えています。 以下のVBSファイルとコマンドを使って、置換することはできました。 が、置換対象が「改行」と「"」の場合、エラーとなって置換できません。 どうすればいいのでしょうか。 よろしくおねがいします。 ********コマンド******** (1)cscript replace.vbs "C:\test.txt" "Jim" "Jane" (2)cscript replace.vbs "C:\test.txt" ""_\n" "a_test" ********VBSファイル(replace.vbs)******** Const ForReading = 1 Const ForWriting = 2 strFileName = Wscript.Arguments(0) strOldText = Wscript.Arguments(1) strNewText = Wscript.Arguments(2) Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile(strFileName, ForReading) strText = objFile.ReadAll objFile.Close strNewText = Replace(strText, strOldText, strNewText) Set objFile = objFSO.OpenTextFile(strFileName, ForWriting) objFile.WriteLine strNewText objFile.Close (1)のコマンドを実行すると、 「Jim」は「Jane」に置換されますが、 (2)のコマンドを実行すると、エラーになり置換されません。 エラーメッセージ: 「Microsoft VBScript 実行時エラー: インデックスが有効範囲にありません。」 よろしくおねがいします。

専門家に質問してみよう