現在、以下の条件で手作業で行っていることを自動化したく、悩んでいます。


【前提条件】
1.Cドライブ直下にLogという名前のフォルダがあります
2.この中には、毎日様々なログファイルが出力されます。
3.そのフォルダの中に、Errorfile_YYYYMMDD_userID.csvというファイルが毎日20個ずつ更新されていきます。

これを、同じ日付でマージして、その日付をファイル名にして出力するツールをperlかvbaで作成しようと考えているのですが、上手く作れません。

どなたかご教示願えないでしょうか…

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/05/28 20:24:15
  • 終了:2013/05/29 20:39:58

ベストアンサー

id:a-kuma3 No.2

a-kuma3回答回数4624ベストアンサー獲得回数19592013/05/28 23:08:38

Errorfile_YYYYMMDD_userID.csvというファイル

だったら、

pat = "\." & ext & "$"

のところを、

pat = "Errorfile_([0-9]{8})_[^.]+\." & ext & "$"

という感じかな。
# ext という仮引数名が合わなくなっているけれども...

んで、出力結果のファイルに日付を含めるには、SubMatches コレクションを使う。
http://msdn.microsoft.com/en-us/library/y27d2s18%28VS.85%29.aspx
正規表現でカッコでくくったところに相当する文字列が SubMatches で取得できる。

If remat.Count > 0 Then
    dateStr = remat.SubMatches(0)       ' 日付に相当するものが dateStr に入ってるはず

    ここで、dateStr を使って、出力先のファイル名を適切に作る

    Call appendFile(path, flist.Name,)
End If

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982013/05/28 20:33:43

バッチファイルか コマンド プロンプトにて

copy *日付*.csv 日付.csv
としてやればよい。


copy *20130528* 20130528.csv


Errorfile_YYYYMMDD_userID.csvの YYYYMMDDの部分を キーにして 連結し YYYYMMDDで出力させる。

他1件のコメントを見る
id:tobias1208

現状は自分でcmdで作業してるんですが、これを他人に簡単にやってもらうべくツールを作成してるのです。。。回答して頂きありがとうございました。

2013/05/28 21:01:52
id:taknt

バッチファイルにしてあげれば 簡単にできます。

2013/05/28 21:14:30
id:tobias1208

現在、VBAでは下記のコードまで完成しているのですが、これに特定の文字列+日付で対象ファイルを絞り込むところで詰まっています。

Option Explicit

'ファイル処理
Sub appendFile(path As String, fname As String, outfname As String)
Dim buf As String, idx As String
Dim fname2 As String, fname3 As String
Dim x As Long

'CSVファイル読み込み&書き込み
fname2 = path & fname
Open fname2 For Input As #1
Open outfname For Append As #2
Do Until EOF(1)
Line Input #1, buf
Print #2, buf
Loop
Close #2
Close #1
End Sub

'ファイル探索+処理実行
Sub hogeCoupling(path As String, ext As String, outfname As String)
Dim fcol As Object, re As Object
Dim flist As Variant, remat As Variant
Dim pat As String, fname As String
Dim n As Long

'処理対象ファイル探索+処理実行
Set fcol = CreateObject("Scripting.FileSystemObject").GetFolder(path).Files
Set re = CreateObject("VBScript.RegExp")
pat = "\." & ext & "$"
With re
.Pattern = pat
.IgnoreCase = True
.Global = True
For Each flist In fcol
Set remat = .Execute(flist.Name)
If remat.Count > 0 Then
Call appendFile(path, flist.Name, outfname)
End If
Next flist
End With
Set re = Nothing
Set fcol = Nothing
End Sub

Sub main()
Call hogeCoupling("C:/Log/", "csv", "C:/test/出力結果/test.csv")
End Sub

id:a-kuma3 No.2

a-kuma3回答回数4624ベストアンサー獲得回数19592013/05/28 23:08:38ここでベストアンサー

Errorfile_YYYYMMDD_userID.csvというファイル

だったら、

pat = "\." & ext & "$"

のところを、

pat = "Errorfile_([0-9]{8})_[^.]+\." & ext & "$"

という感じかな。
# ext という仮引数名が合わなくなっているけれども...

んで、出力結果のファイルに日付を含めるには、SubMatches コレクションを使う。
http://msdn.microsoft.com/en-us/library/y27d2s18%28VS.85%29.aspx
正規表現でカッコでくくったところに相当する文字列が SubMatches で取得できる。

If remat.Count > 0 Then
    dateStr = remat.SubMatches(0)       ' 日付に相当するものが dateStr に入ってるはず

    ここで、dateStr を使って、出力先のファイル名を適切に作る

    Call appendFile(path, flist.Name,)
End If

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません