コマンドプロンプトでのファイル整形・結合を行う

コマンドプロンプトでのファイル整形・結合を行う

採取したデータの整形をする必要があったのでバッチファイルを書きました。今後の自分のためにメモを残しておきます。イマドキはPowerShellでスパっと書けるべきなのだろうけど。職場のPCが未だにXpでアレ(‘A`)

全体

  • 採取したCSV(JSxx.csv)を結合して
  • JAxxA.csvの特定カラムからPickしてJAxxB.csvと加算したり
  • 結果から別のcsv(Join_JS.csv)を作る

というなんとも流用しようがないバッチ。

@ECHO OFF
::init
DEL /F Join_JS*.csv
type nul > Join_JS.csv

::Step 1
dir JS*.csv /B /N > list.txt
FOR /F "delims=" %%K IN (list.txt) DO CALL :SUB %%K
GOTO JA

:SUB
FOR /F "usebackq" %%P IN (`TYPE %1`) DO SET JS=%%P
ECHO %JS:~2% >> Join_JS.csv
EXIT /B 0

::Step 2
:JA
dir JA*A.csv /B /N > list2.txt
FOR /F "delims=" %%L IN (list2.txt) DO CALL :SUB2 %%L
GOTO END

:SUB2
FOR /F "delims=, tokens=2" %%M IN (%1) DO ECHO %%M >> Join_JS.csv
FOR /F "delims=, tokens=3" %%N IN (%1) DO SET JAA=%%N
SET JAFILE=%1%
FOR /F "delims=" %%O IN (%JAFILE:~,4%B.csv) DO SET JAB=%%O
SET /A JAAB=%JAA%+%JAB:~2%
ECHO %JAAB% >> Join_JS.csv
EXIT /B 0

:END
DEL /F list?.txt

 

細部注釈

自分は絶対忘れるので、こねくり回したところだけ注釈つけておきます。

ファイルの中身を1行づつ読んで処理

FOR /F "delims=" %%K IN (list.txt) DO CALL :SUB %%K

対象ファイル一覧を書いたlist.txtから1行づつ読み込んで:SUBに書かれたサブルーチンを順次処理する。サブルーチン先では渡した変数は%1(or%~1)に入る。EXIT /B 0で戻り値を指定して戻る。

コマンド結果を変数に&文字列のカット

FOR /F "usebackq" %%P IN (`TYPE %1`) DO SET JS=%%P
ECHO %JS:~2% >> Join_JS.csv

FORを使ってコマンドの実行結果を変数に入れています。SET P=TYPE %1とはいかないらしい。次に変数JSの中身から先頭の2byteをカットして出力(先頭に制御文字が入っていた為)。「%JS:~,2%」にすると後ろから2byteをカット。「%JS:~2,2%」で前後2byteカット。
これは変数相手にしかできない様なので一度変数に入れてます。

CSVの特定のセルを読む

FOR /F "delims=, tokens=3" %%N IN (%1) DO SET JAA=%%N

カンマ区切りcsvなのでデリミタ(区切り文字)を,にして3つ目を読み込んで変数へ。

コマンドプロンプトで足し算

SET /A JAAB=%JAA%+%JAB:~2%

四則演算が可能。/Aを入れないと文字列として扱われます。

以上。

コマンドプロンプトの場合は変数が環境変数としてそのまま残ります。サーバなど長期に再起動しない装置で使う際は

set JAAB=

などして開放する事が必要。

 

One thought on “0

  1. 一見無関係な作業でも同様の縛りで同様の苦肉の策を先に講じて頂いた挙句参考にさせていただいて誠に申し訳ありません。謹んでお礼申し上げます。それとアニメのエンコード設定もひそかに参ry

コメントを残す