こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

回答受付中の質問

バッチファイルについて

教えて下さい。
複数のログファイルを、バッチファイルをつかってひとつのCSVファイルにまとめます。
forfiles コマンドを使って、所定内の*.csv ファイルを typeで出力し
1つのCSVファイルにまとめます。

しかし、各ログファイルの文末が改行されておらず1つにまとめると
前のファイルの行末に次のログファイルの1文字目が来てしまいます。

ログファイルを、全て添付の下側の画像のように改行する設定にできたらいいですが
数が多いのでバッチコマンドに何か手を加える方向でいきたいです。

改行のCSVファイルを用意して、ログファイルの間に繰り返しかませることも
できるならありかと考えています。

何かいい方法はないでしょうか?

投稿日時 - 2018-10-23 21:27:03

QNo.9550630

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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!」と表示しています。

投稿日時 - 2018-10-25 21:49:37

お礼

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

投稿日時 - 2018-10-26 22:10:57

ANo.1

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

投稿日時 - 2018-10-23 22:43:29

お礼

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

投稿日時 - 2018-10-26 22:10:03

あなたにオススメの質問