windowsバッチで下記のbefore.csvからafter.csvのように変換をしたいと考えています。
「AFTER_XXXのCSVの一つ目の値とBEFORE_XXXの要素が一致している場合」
として汎用的に処理を書きたいと思っています。
下記のイメージで出来ると思ったのですが、
サブルーチンからうまく値を取得できません。
ご教授いただければ幸いです。
(AFTER_XXXはconfファイルへ外だしする予定の為、名称が変わった場合に改修を容易にしたいという背景です。)
windowsbat
1rem test.bat 2 3@echo off 4 5setlocal enabledelayedexpansion 6 7set BEFORE_CSV=before.csv 8set AFTER_CSV=after.csv 9set BEFORE_STRING_TOKYO=東京 10set AFTER_STRING_TOKYO=東京,1,2 11set BEFORE_STRING_OSAKA=大阪 12set AFTER_STRING_OSAKA=大阪,10,20 13 14if exist %AFTER_CSV% del %AFTER_CSV% 15 16rem CSVから値を取得する 17for /f "delims=," %%i in ("%AFTER_STRING_TOKYO%") do ( 18 set TOKYO=%%i 19) 20for /f "delims=," %%i in ("%AFTER_STRING_OSAKA%") do ( 21 set OSAKA=%%i 22) 23 24( 25for /f "delims= eol=#" %%a in (%BEFORE_CSV%) do ( 26 set line=%%a 27 for /f "delims=," %%b in ("%%a") do ( 28 if "%%b"=="%TOKYO%" ( 29 echo !line:%BEFORE_STRING_TOKYO%=%AFTER_STRING_TOKYO%! 30 ) else if "%%b"=="%OSAKA%" ( 31 echo !line:%BEFORE_STRING_OSAKA%=%AFTER_STRING_OSAKA%! 32 ) else ( 33 echo %%a 34 ) 35 ) 36) 37)>%AFTER_CSV% 38 39rem csvの1項目目を取得する 40:returnFirstColumn 41setlocal 42 43for /f "delims=," %%i in ("%1") do ( 44 set val=%%i 45) 46endlocal && set %2=!val! 47exit /b
上記の処理でひとまず動くのですが、
下記のイメージでサブルーチン化したいと考えています。
windowsバッチ
1rem test.bat 2 3~中略~ 4call :returnFirstColumn %AFTER_TOKYO% TOKYO 5call :returnFirstColumn %AFTER_OSAKA% OSAKA 6~中略~ 7 if "%%b"=="%TOKYO%" ( 8~中略~ 9rem csvの1項目目を取得する 10:returnFirstColumn 11setlocal 12 13for /f "delims=," %%i in ("%1") do ( 14 set val=%%i 15) 16endlocal && set %2=!val! 17exit /b 18
csv
1#before.csv 2東京,3,4 3大阪,30,40
csv
1#after.csv 2東京,1,2,3,4 3大阪,10,20,30,40
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/23 13:16
2021/07/23 13:34
2021/07/23 13:39
2021/07/23 13:43
2021/07/23 13:47
2021/07/23 23:01