質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

1回答

5398閲覧

vbs:csv条件毎結合の方法が知りたい

manataku

総合スコア45

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2017/09/19 08:37

実現したいこと
同じフォルダの中に"AAA"から始まるファイル名と"ccc"から
始まるファイルの2種類のCSVがあり、ファイル名を項目追加し、
vbsにて種類毎に結合したい。

環境 windows7 pro 64bit

試したこと
既出の下記コードを参考にフォルダ内にあるCSVファイルを
結合することはできましたので、条件を特定のファイル名を含むにするため、
下記のように変更しましたが無反応でした。

****objRE.Pattern = ".csv$" ****

→ "^aaa.*.csv$"

特定の文字を含むCSVファイルを対象に結合させるにはどのような
正規表現にすれば良いかアドバイス頂けないでしょうか。

vbs

1'----ここからコード 2Set objRE = CreateObject("VBScript.RegExp") 3'検索条件の設定 4objRE.Pattern = "\.CSV$" 5 6For Each FileName In Folder.Files 7 8 If objRE.Test(Lcase(FileName)) Then 9 LineNum = 1 10 Set ReadCsv = fso.OpenTextFile(FileName) 11 12 Do Until ReadCsv.AtEndOfStream = True 13 OutTmp = FileName & "," & LineNum & "," & ReadCsv.ReadLine() 14 OutTxt.WriteLine(OutTmp) 15 LineNum = LineNum + 1 16 Loop 17 18 ReadCsv.Close() 19 End if 20Next 21 22OutTxt.Close() 23 24set fso = Nothing 25set Folder = Nothing 26set objRE = Nothing 27 28'----ここまで

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これでちゃんと動きます。
エラーハンドリングなどを手厚く実施したために少し長くなっています。
これで一度試してみて下さい。

VBS

1 ' CSVのマージ実施 2 Call MergeCsv 3 4Sub MergeCsv() 5 6 ' 変数宣言 7 Dim fso 8 Dim path 9 10 ' オブジェクト初期化 11 Set fso = CreateObject("Scripting.FileSystemObject") 12 13 ' 処理対象フォルダパス取得 14 path = InputBox("処理対象フォルダパスを入力して下さい", "情報入力") 15 16 ' 入力されなかった場合は処理終了 17 If path = "" Then 18 MsgBox "処理対象フォルダパスが入力されませんでした。", vbCritical + vbOKOnly, "エラー" 19 Exit Sub 20 End If 21 22 ' 入力されたフォルダが存在しない場合は処理終了 23 If Not fso.FolderExists(path) Then 24 MsgBox "処理対象フォルダパスは存在しません。", vbCritical + vbOKOnly, "エラー" 25 Exit Sub 26 End If 27 28 Call MergeCsvSub(path, "AAA") 29 Call MergeCsvSub(path, "CCC") 30 31 ' オブジェクト開放 32 Set fso = Nothing 33 34 ' 結果出力 35 MsgBox "処理が終了しました。" & vbLf & "処理対象フォルダ内のファイルを確認して下さい", vbInformation + vbOKOnly, "処理完了" 36 37End Sub 38 39 40Sub MergeCsvSub(path, pReg) 41 42 ' 変数宣言 43 Dim re, fso, file, textStream 44 Dim lineNum 45 Dim mergedText 46 Dim time 47 48 ' オブジェクト初期化 49 Set re = CreateObject("VBScript.RegExp") 50 Set fso = CreateObject("Scripting.FileSystemObject") 51 52 ' 検索条件の設定 53 With re 54 .Global = True 55 .IgnoreCase = True 56 .Pattern = "^" & pReg & ".*\.csv$" 57 End With 58 59 ' 結合結果初期化 60 mergedText = "" 61 62 ' 全ファイル走査 63 For Each file In fso.GetFolder(path).Files 64 65 ' 条件に合致するファイルのみ処理 66 If re.Test(file.Name) Then 67 68 ' テキスト取得 69 Set textStream = fso.OpenTextFile(file.path) 70 71 ' 行数初期化 72 lineNum = 1 73 74 ' 全行走査 75 With textStream 76 Do Until .AtEndOfStream 77 78 ' 結合後テキストを生成 79 If mergedText <> "" Then 80 mergedText = mergedText & vbLf & file.Name & "," & lineNum & "," & .ReadLine() 81 Else 82 mergedText = mergedText & file.Name & "," & lineNum & "," & .ReadLine() 83 End If 84 85 ' カウンタアップ 86 lineNum = lineNum + 1 87 88 Loop 89 90 ' テキストを閉じる 91 .Close 92 93 WScript.Echo file.Name & "を処理しました" 94 95 End With 96 97 End If 98 99 Next 100 101 ' 時刻取得 102 time = Year(Now()) 103 time = time & Right("0" & Month(Now()), 2) 104 time = time & Right("0" & Day(Now()), 2) 105 time = time & Right("0" & Hour(Now()), 2) 106 time = time & Right("0" & Minute(Now()), 2) 107 time = time & Right("0" & Second(Now()), 2) 108 109 ' 結果出力 110 With fso.OpenTextFile(path & "\" & pReg & "result_" & time & ".csv", 2, True, -2) 111 .Write mergedText 112 .Close 113 End With 114 115 ' オブジェクト開放 116 Set re = Nothing 117 Set fso = Nothing 118 Set file = Nothing 119 Set textStream = Nothing 120 121End Sub

投稿2017/09/19 10:04

編集2017/09/19 11:55
yamashita_yuich

総合スコア316

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manataku

2017/09/19 11:18

baseballyamaさん 早速のご回答ありがとうございました。 コードを.vbsにて保存し実行したところ、 結果が何も出力されず、メッセージも表示されませんでした。 下記の実行方法が正しいか見て頂けないでしょうか。 csvmerge.vbs フォルダ内に対象ファイルを保存 ファイル名 AAA001_output.csv ccc001_output.csv AAA002_output.csv ccc002_output.csv ダイアログにて対象フォルダ名を入力後、応答なしになります。 タスクマネージャーのプロセスを見るとwscript.exeが動いているようですが。。 期待する結果 AAA.txt(AAA001_output.csv+AAA002_output.csv) ccc.txt(ccc001_output.csv+ccc002_output.csv) 環境など確認すべきところはありますでしょうか。 よろしくお願い致します。
yamashita_yuich

2017/09/19 12:23 編集

すいません、少し要件を勘違いしていました。 ファイルやファイルサイズが大きいとどこまで実行されたのかわからなくなるので、 cscript "vbsのファイルパス" をバッチ実行して頂けますか。どこまで処理が終わったかをリアルタイムで確認できます。 ※プログラムは修正してます。
manataku

2017/09/20 01:08

baseballyamaさん ご回答ありがとうございます! 要件の記載が分かりづらくすいません。 修正コードを実行したところ前回と同じくフォルダパス入力後、 5分ほど待っても何も動きがありませんでした。 リアルタイムで確認可能なバッチファイルですが、 cscript "C:\Users\Desktop\merge.vbs"とテキストファイルに記載し、拡張子.batで保存しましたが合ってますでしょうか。 コマンドからcscript C:\Users\Desktop\merge.vbs としても特に動きはありませんでした。初歩的な質問ばかりで恐縮ですが、何か間違っておりましたらご指摘いただけばと思います。
yamashita_yuich

2017/09/20 01:27

起動方法については説明が雑でした。 コマンドプロンプトから cscript "vbsのパス" で起動して下さい。(ご記載の下の方法で正しいです) すいませんが、すぐに原因が特定できないので何回か質問させて下さい。 まずは、 ファイル数と大体のファイルサイズを教えて下さい。
manataku

2017/09/22 00:20

baseballyamaさん 回答遅くなり申し訳ありません。 ファイル数は日別で最大一か月分あり、1ファイル20~30メガほどになります。 作業の度にすべてのファイルを結合するのも非効率であるため、 前日までの蓄積+当日分にしたいと考えております。 コマンド実施方法についてありがとうございます。 コマンドから実行致します。
yamashita_yuich

2017/09/22 01:09

1ファイルがそんなに大きいとは想定していませんでした。 vbsはスクリプトなので非常に処理速度が遅いです。20-30Mのファイルのマージは相当時間がかかると想定しています。 気長に待つか、Javaで実装し直すのが良いと思います。
manataku

2017/09/22 03:00

承知しました。 回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問