フォルダ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も見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
一回も披露したことのない豆知識
あなたの「一回も披露したことのない豆知識」を教えてください。 「そうなんだね」と「確かに披露する場所ないね」で評価します。
-
土曜の昼、学校帰りの昼メシの思い出
週休2日が当たり前の今では懐かしい思い出ですが、昔は土曜日も午前中まで学校や会社がある「半ドン」で、いつもよりちょっと早く家に帰って食べる昼ご飯が、なんだかちょっと特別に感じたものです。
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
VBSを使用し、指定フォルダ内のテキストファイルを一つに結合させたい
Visual Basic(VBA)
-
VBSで指定行に挿入
その他(プログラミング・Web制作)
-
VBSで、テキストファイルに対して、全体の途中に文字列を追加したい
その他(プログラミング・Web制作)
-
-
4
vbsで最後の行を削除する
その他(プログラミング・Web制作)
-
5
複数のエクセルブックをひとつのブックにまとめる方法
Visual Basic(VBA)
-
6
VBS ファイルマージ処理
その他(プログラミング・Web制作)
-
7
VBScriptで、ファイルから任意の行のみ取り出す方法について
その他(プログラミング・Web制作)
-
8
ファイルの先頭行を全て削除したい
Windows Vista・XP
-
9
CSVの項目行を削除して一つのファイルに結合する
その他(プログラミング・Web制作)
-
10
vbsからのExcelマクロ呼び出しの際に保存ダイアログが表示されてしまう
その他(プログラミング・Web制作)
-
11
VBS フォルダ内にあるすべてのファイルを検索→ファイルが特定のファイルなら開く
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
.txtではなく.logの方が良いの...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
Windowsのバッチファイルを利用...
-
フルパスの中にワイルドカード...
-
ADODB.Streamで開いたファイル...
-
拡張子を元に戻す
-
バッチファイル 複数ファイル...
-
ファイルの最後に文字列挿入
-
テキストファイルで提出とは?
-
forfilesで検索したファイルを...
-
Excelで、大量のファイルをテキ...
-
UWSCでテキストファイルを開い...
-
renameコマンドについて
-
COPYコマンドで結合すると余計...
-
CMakeでエラーが出ます
-
EXCEl/VBAで拡張子なしのファイ...
-
リモートのファイル存在確認
-
C言語、ファイルの存在チェック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
.txtではなく.logの方が良いの...
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
多数のサブディレクトリ内のフ...
-
拡張子を元に戻す
-
COPYコマンドで結合すると余計...
-
テキストファイルで提出とは?
-
ファイルの最後に文字列挿入
-
renameコマンドについて
-
forfilesで検索したファイルを...
-
バッチファイル 複数ファイル...
-
Windowsのバッチファイルを利用...
-
テキスト(txt)→ワード(docx)へ...
-
txtとはWordでなんですか?
-
psqlでエラーログをとりたい
-
UWSCでテキストファイルを開い...
-
ファイル内容の修正、行削除に...
-
バッチファイルで文字列削除に...
-
accessでSQL文を使ってcsvファ...
-
UWSCでファイルを開く方法
おすすめ情報