【250枚】くりかえしバッチ処理(複数のファイルに対してcutやpaste)

【250枚】くりかえしバッチ処理(複数のファイルに対してcutやpaste)
複数のCSVファイルがあります。 [例]
1.csv
header
a b c
a b c
a b c
a b c
2.csv
header
d e f
d e f
d e f
d e f
先頭行(header)を除いた2~3列目だけ抽出し(cut -c 2-3 ?)、かつ抽出した列を横に並べて(paste?)、別ファイルに出力(>3.csv)したいです。
[例]
3.csv
b,c,e,f
b,c,e,f
b,c,e,f
b,c,e,f
※カンマ区切りで出力し、CSV内で別セルに格納したい
上記を叶えるfor文バッチファイルは作れないでしょうか。
(作業環境的にコンパイラ等ないため、バッチで何とか処理したいです)
どうかご教示のほどよろしくお願い申し上げます!涙
初月無料の見放題はこちら
set /a N=1
for /f “tokens=2-3 skip=1” %%A in (1.csv) do call :sub %%A %%B
goto :eof
:sub
for /f “tokens=2-3 skip=%N%” %%C in (2.csv) do echo %1,%2,%%C,%%D>>3.csv&goto next
:next
set /a N=%N%+1
※参考にしたコード
◆VBSでやるとコーディング量が多くなるのだなあ…とlin********さんの回答を拝見して思う
当方のバッチ 200byte、lin********さんのVBS 810byte 4倍ですね
◆>複数のファイルに対してcutやpaste
>cut -c 2-3 ?
>paste?
>>3.csv
ってLinuxって事なのかな?
確かにWinでも出来るようですけど、その環境下でやりたいって事?
◆もし、「VBScript」が使用可能でしたら、お試しください(「VBScript」は、「Windows」が標準で持っている言語で、メモ帳だけで記述でき、コンパイルなどの必要は全くなく、ダブルクリックするだけで、動きます)。
列「B」以降すべての列を書き出していますが、それがダメな場合(列「B」と列「C」限定など)は、後述します。
以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存します。
「~」の部分は、何でもかまいませんが、「.vbs」の部分は、必ず、半角です。
できたプログラムファイル(「~.vbs」ファイル)を、これから処理したい「csv」ファイル群が存在するフォルダに放り込んで、ダブルクリック(「シングルクリック」→「Enter」の方が確実)するだけです。
同じフォルダ内に「処理したファイルの数+1」という名前の結果ファイルを作成します。
最後に「Finished!」と表示しますので、「OK」を押して、終了してください。
Option Explicit
Dim a, c, cr, cv, f, gf, i, j, 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)) = “csv” 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 cr = so.OpenTextFile(gf & “\” & CStr(c + 2) & “.csv”, 2, True)
For i = 0 to c
Set cv = so.OpenTextFile(gf & “\” & n(i), 1)
x = cv.ReadLine
Do Until cv.AtEndOfStream
a = Split(cv.ReadLine, “,”)
x = “”
For j = 1 to UBound(a)
x = x & a(j) & “,”
Next
cr.WriteLine Left(x, Len(x) – 1)
Loop
cv.Close
Set cv = Nothing
Next
cr.Close
Set cr = Nothing
Set gf = Nothing
Set so = Nothing
MsgBox(“Finished!”)
簡単な説明です。
Option Explicit
「厳密に」というような意味ですが、気にしないでください。
Set so = CreateObject(“Scripting.FileSystemObject”)
ファイルやフォルダを扱えるようにしていますが、今回は特に、「csv」というテキストファイルを扱うのにも必要です。
Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName))
プログラムファイル自身が存在するフォルダを取得しています。
c = -1
カウント用変数の初期化。
For Each f In gf.Files
プログラムファイルの存在するフォルダ内のファイルを1つずつすべて処理。
If LCase(so.GetExtensionName(f.Name)) = “csv” Then
もし、拡張子が「csv」なら、
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 cr = so.OpenTextFile(gf & “\” & CStr(c + 2) & “.csv”, 2, True)
処理するファイルが質問のように2個だけだった場合は、同じフォルダ内に「3.csv」というファイルを、「書き込み専用」で新規作成しています。
For i = 0 to c
見付かったすべての「csv」ファイルをファイル名が小さい順に処理します。
Set cv = so.OpenTextFile(gf & “\” & n(i), 1)
ファイルを「読み込み専用」で開いています。
x = cv.ReadLine
1行読み飛ばし。
Do Until cv.AtEndOfStream
ファイルの終端まで処理。
a = Split(cv.ReadLine, “,”)
「Split()」は、区切り記号(今回は「,」)を使って、読み込んだ1行が「a,b,c」の場合、「a(0) = “a”」、「a(1) = “b”」、「a(2) = “c”」と配列変数に格納します。
x = “”
書き込み用変数の初期化。
For j = 1 to UBound(a)
x = x & a(j) & “,”
Next
2列目から最終列まで処理(★★★したがって、2列目と3列目限定でしたら、この「UBound(a)」の部分を、「2」に変更してください。「0」から始まりますので、「1」が「2」列目、「2」が「3」列目になります★★★)。
「UBound()」は、配列変数の添え字(「()」内の数字)の最大値を返します。
上記の例でしたら「a(2) = “c”」の「2」です。
cr.WriteLine Left(x, Len(x) – 1)
最後に不要な「,」が付いているので、先頭から最後の文字の前まで、を書き出しています。
Loop
を、ファイルの終端まで繰り返しています。
cv.Close
Set cv = Nothing
「読み込み」ファイルを閉じています。
Next
を、すべての「csv」ファイルで繰り返しています。
cr.Close
結果ファイルを閉じています。
Set cr = Nothing
Set gf = Nothing
Set so = Nothing
MsgBox(“Finished!”)
あとは、終了処理で、最後に「Finished!」と表示しています。
初月無料の見放題はこちら

コメント