• 締切済み

バッチファイルについて

教えて下さい。 複数のログファイルを、バッチファイルをつかってひとつのCSVファイルにまとめます。 forfiles コマンドを使って、所定内の*.csv ファイルを typeで出力し 1つのCSVファイルにまとめます。 しかし、各ログファイルの文末が改行されておらず1つにまとめると 前のファイルの行末に次のログファイルの1文字目が来てしまいます。 ログファイルを、全て添付の下側の画像のように改行する設定にできたらいいですが 数が多いのでバッチコマンドに何か手を加える方向でいきたいです。 改行のCSVファイルを用意して、ログファイルの間に繰り返しかませることも できるならありかと考えています。 何かいい方法はないでしょうか?

みんなの回答

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

「VBScript」による回答ですので、「バッチ」でなければならないようでしたら、無視してください。 このプログラムは、「~.log」ファイル群の存在するフォルダにプログラムファイルを放り込んで、プログラムファイルをダブルクリック(「シングルクリック」→「Enter」の方が確実)すると、同じフォルダ内に「MergeLog.csv」という結果ファイルを作成します。 最後に「Finished!」と表示しますので、「OK」を押して、終了してください。 以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。 「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず、半角です。 できたプログラムファイル(「~.vbs」ファイル)を、「~.log」ファイル群が存在するフォルダ内に放り込んで、ダブルクリックしてください。 Option Explicit Dim a, c, cv, f, gf, i, j, lg, n(), so, x Set so = CreateObject("Scripting.FileSystemObject") Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName)) c = - 1 For Each f In gf.Files If LCase(so.GetExtensionName(f.Name)) = "log" Then c = c + 1 ReDim Preserve n(c) n(c) = f.Name End If Next For i = 0 to c - 1 For j = i + 1 to c If n(i) > n(j) Then x = n(i) n(i) = n(j) n(j) = x End If Next Next Set cv = so.OpenTextFile(gf & "\MergeLog.csv", 2, True) For i = 0 to c Set lg = so.OpenTextFile(gf & "\" & n(i), 1) a = lg.ReadAll cv.WriteLine a lg.Close Set lg = Nothing Next cv.Close Set cv = Nothing Set gf = Nothing Set so = Nothing MsgBox("Finished!") 簡単な説明です。 Option Explicit 「厳密に」というような意味ですが、気にしないでください。 Set so = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしていますが、今回は特に、テキストファイルを扱うのにも必要です。 Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName)) プログラムファイルの存在するフォルダを取得しています。 c = - 1 「log」ファイル、カウント用変数の初期化。 For Each f In gf.Files プログラムファイルの存在するフォルダ内のすべてのファイルを1つずつ処理。 If LCase(so.GetExtensionName(f.Name)) = "log" Then もし、拡張子が「log」なら、 c = c + 1 1つカウント。 ReDim Preserve n(c) n(c) = f.Name 配列変数を用意して、格納しています。 End If Next を、繰り返しています。 For i = 0 to c - 1 For j = i + 1 to c If n(i) > n(j) Then x = n(i) n(i) = n(j) n(j) = x End If Next Next 配列変数に格納したファイル名を「小さい順」にソートしています。 Set cv = so.OpenTextFile(gf & "\MergeLog.csv", 2, True) 同じフォルダ内に「MergeLog.csv」ファイルを「書き込み専用」で「新規作成」しています。 For i = 0 to c 「Log」ファイルの数だけ処理。 Set lg = so.OpenTextFile(gf & "\" & n(i), 1) 「Log」ファイルを「読み込み専用」で開いています。 a = lg.ReadAll 一気に全部読み込んでいます。 cv.WriteLine a 「MergeLog.csv」ファイルに書き出しています。 通常、一気に全部読み込んだ場合、通常、「cv.Write」となるのですが、最後に「改行」を書き加えるため、「cv.WriteLine」としています。 lg.Close Set lg = Nothing 「Log」ファイルを閉じています。 Next を、すべての「Log」ファイルで繰り返しています。 cv.Close Set cv = Nothing 「csv」ファイルを閉じています。 Set gf = Nothing Set so = Nothing MsgBox("Finished!") あとは、終了処理で、最後に「Finished!」と表示しています。

istudent
質問者

お礼

解決しました。ありがとうございました。 各行毎の説明まで記載してありがとうございます。 vbsは使いませんでしたが、勉強になります

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

typeでなく、more を使えば良いかと思います。

istudent
質問者

お礼

解決しました。ありがとうございました。