
フォルダAの中に以下のファイルがあります。
・1.txt
・2.txt
・
・
・
・10.txt
これを全て連結させたsum.txtを出力として同じフォルダに入れたいと考えています。
ファイル名を取得してフォルダの中の上から順番にsum.txtへ書き込んでいけばいいのはわかるんですが
どのようにプログラムで書いていいのかわかりません。
特にループさせるところがわかりません。
(初心者ですいません)
プログラム例をご教授いただければありがたいです。
また、そういった内容を勉強できるサイトがあれば紹介していただけるとありがたいです。
よろしくお願いいたします。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
ANo.3お礼への回答です。
>サンプルに書いてもらったものだと
>出力が2回繰り返されてしまうのは何ででしょうか?
ANo.2、ANo.3のコードでは入力フォルダと同じフォルダにtxtファイルを出力すると、それも連結してしまいます。そのため2回繰り返されたりすることがあります。これを解決するには、別のフォルダに出力するか、出力ファイルを連結から除外するようにすればよいでしょう。
さて、どうしますか?
:
(しばらく考察)
:
どうしても同じフォルダに出力したい場合、出力ファイルを連結から除外する簡単な方法は、ANo.3のコードのIfに条件を追加することでしょう。例えば、
If (LCase(fso.GetExtensionName(fn))="txt")And(fn.Name<>"sum.txt") Then
これは美しくないですね…。出力ファイルを作る前にFilesコレクションからファイル名を配列などに取り出し、必要ならANo.2で触れた並べ替えを行ってから連結すると美しいと思います。
No.3
- 回答日時:
ANo.2お礼への回答です。
>このvbsファイルがあるローカルフォルダという指定方法はどうしたらよいのでしょうか?
WScript.ScriptFullNameで実行中のスクリプトのパスが求まりますので、それを使います。なお、vbsファイルを一緒に置くため拡張子txtのみ取り出すようにする必要があります。コードは例えば下記のようです。
Option Explicit
Const OutFileName = "C:\Out\sum.txt"
Const ForReading = 1, ForWriting = 2
Dim fso, f, fc, fn, InFile, OutFile
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(fso.GetParentFolderName(WScript.ScriptFullName))
Set fc = f.Files
Set OutFile = fso.OpenTextFile(OutFileName, ForWriting, true)
For Each fn in fc
If LCase(fso.GetExtensionName(fn))="txt" Then
Set InFile = fso.OpenTextFile(fn, ForReading)
OutFile.Write(InFile.ReadAll())
InFile.Close()
End If
Next
OutFile.Close()
WScript.Echo "連結が終わりました。"
-----
WScript.exeで実行するものとして、入力フォルダ指定とスクリプト起動の方法をいくつか考察しましたので、ついでにアドバイス申し上げます。
(1)ScriptFullNameから実行中のフォルダのパスを求める。フォルダ内にvbsファイルを置いてダブルクリック。
上の方法ですね。もしフォルダが複数だとvbsファイルを複数置くことになり保守が面倒です。
(2)フォルダ名をArgumentsから求める。デスクトップなどにvbsを置いておき、フォルダをドラッグ&ドロップする。
私は好んで使っています。頻繁に使うならお奨めです!
(3)フォルダ名をArgumentsから求める。上のバリエーションで、SendToフォルダにvbsを置いておき、フォルダを右クリックして「送る」。
私は好んで使っています。たまに使うならお奨めです!
(4)BrowseForFolderでフォルダツリーからフォルダを選択する。適当なところにvbsを置いてダブルクリック。
キー入力が不要でGUIらしいインタフェース。
(5)InputBoxでフォルダのパスをキー入力する。適当なところにvbsを置いてダブルクリック。
InputBoxに全て入力すると面倒。デフォルトを表示して一部書き換えにすれば便利かも。
なお、(2)(3)(4)(5)の方法ではvbsファイルでなくショートカットを置いてもよいです。
アドバイスありがとうございました!
もう少し勉強してみます。
サンプルに書いてもらったものだと
出力が2回繰り返されてしまうのは何ででしょうか?
No.2
- 回答日時:
ファイル名や個数がわからないのでしたら、WSHドキュメントのFilesコレクションのサンプル等から大筋として下記のようなコードが考えられます。
【同じフォルダにはできませんが】ご参考まで。なお、Windows XP Pro SP2で試したところ、連結の順番が1.txt, 10.txt, 2.txt, 3.txt,…になりました。1.txt, 2.txt, 3.txt,…10.txtの順番にするにはファイル名を取り出して並べ替えてから連結する必要があります。そもそもFilesコレクションからの取り出し順は規定されていないようなので必須の処理かもしれません(?)。
実用向けの改善点としては、入力ファイルが巨大でしたらReadAllではなく1行ずつ連結するとか、拡張子txtのみ取り出すようにするとか、出力ファイルの上書きを確認するとか、あるいは出力ファイル名に日付や時刻を含めるとか。
Option Explicit
Const InFolder = "C:\In"
Const OutFileName = "C:\Out\sum.txt"
Const ForReading = 1, ForWriting = 2
Dim fso, f, fc, fn, InFile, OutFile
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(InFolder)
Set fc = f.Files
Set OutFile = fso.OpenTextFile(OutFileName, ForWriting, true)
For Each fn in fc
Set InFile = fso.OpenTextFile(fn, ForReading)
OutFile.Write(InFile.ReadAll())
InFile.Close()
Next
OutFile.Close()
WScript.Echo "連結が終わりました。"
回答ありがとうございます!
できましたが、
Const InFolder = "C:\In"
を指定しないで、このvbsファイルがあるローカルフォルダという指定方法はどうしたらよいのでしょうか?
No.1
- 回答日時:
単純連結ならDOSのコマンドでやれば1行で済むんじゃないかと。
つまりループさせる必要がありません。Set wShell = CreateObject("WScript.Shell")
Set oExec = wShell.Exec("cmd.exe /c copy c:\1.txt + c:\2.txt + c:\3.txt c:\all.txt")
MsgBox oExec.StdOut.ReadAll()
この程度なら基礎知識だけなので、特にどこかで勉強するというほどのものでもないですが、まずは基本的なことをさらっと抑えておけばよいんじゃないんですかね。後は引っかかる度に個別で検索すれば。
http://www.google.com/search?num=50&hl=ja&q=WSH% …
回答ありがとうございます!
こういう方法もあるんですね!
望んでいるものは出力できました。
他のプログラムにも応用させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/16 14:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- その他(プログラミング・Web制作) フォルダ内の特定 拡張子のファイルを一括実行するBat ファイルについて 4 2022/04/17 09:51
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/15 16:33
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/04 12:47
このQ&Aを見た人はこんなQ&Aも見ています
-
VBSを使用し、指定フォルダ内のテキストファイルを一つに結合させたい
Visual Basic(VBA)
-
VBS ファイルマージ処理
その他(プログラミング・Web制作)
-
COPYコマンドで結合すると余計な改行コードができる
その他(プログラミング・Web制作)
-
-
4
ファイル結合について
Visual Basic(VBA)
-
5
VBSの処理中一旦処理を止めて再開させたい。
Visual Basic(VBA)
-
6
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
7
ファイルの先頭行を全て削除したい
Windows Vista・XP
-
8
VBScriptでファイルの日時順(降順)で並び替えて一覧を出力したい。
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでワークシートを引数として...
-
.txtではなく.logの方が良いの...
-
バッチ処理でファイルの中身を...
-
多数のサブディレクトリ内のフ...
-
psqlでエラーログをとりたい
-
ファイルの最後に文字列挿入
-
バッチファイル 複数ファイル...
-
バッチファイルの修正箇所を教...
-
iPhone版Dropboxからtxtファイ...
-
拡張子を元に戻す
-
NOTEPAD.EXEが見つかりません。
-
WinAPI SHGetFileInfoでICONフ...
-
MATLABで行列を配列に格納する方法
-
ファイルの入出力
-
VBファイルを0KBにする方法
-
【エクセルVBA】エクセルからテ...
-
検索CGIでいいのを知りませんか?
-
フォルダーの中のファイルを数...
-
テキストファイルで提出とは?
-
fortran90 ファイル出力の名前
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
psqlでエラーログをとりたい
-
ファイル内容の修正、行削除に...
-
バッチファイルで文字列削除に...
-
テキストファイルで提出とは?
-
拡張子を元に戻す
-
ファイルの最後に文字列挿入
-
UWSCでテキストファイルを開い...
-
エクセルの各セルの内容をそれ...
-
ファイル名の一部をbatで変更し...
-
renameコマンドについて
-
accessでSQL文を使ってcsvファ...
-
3つ以上のテキストファイルをコ...
-
Windowsのバッチファイルを利用...
-
ファイルのワイルドカードについて
おすすめ情報