質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

1回答

1461閲覧

buwindowsバッチ サブルーチンから値を返却する

anko__

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2021/07/23 10:28

編集2021/07/23 13:14

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

1.まず、あちこちにある空白の欠如による文法エラーを直しましょう。

2.下記のように変数名の混乱があります。

CMD

1set BEFORE_STRING_TOKYO=東京 2set AFTER_STRING_TOKYO=東京,1,2 3set BEFORE_STRING_OSAKA=大阪 4set AFTER_STRING_OSAKA=大阪,10,20 5~~~ 6call :returnFirstColumn %AFTER_TOKYO% TOKYO 7call :returnFirstColumn %AFTER_OSAKA% OSAKA

これらを直してもまだ他に問題があるかも。

#コメントに対応した追記

CMD

1@echo off 2setlocal enabledelayedexpansion 3 4set BEFORE_CSV=before.csv 5set AFTER_CSV=after.csv 6set BEFORE_STRING_TOKYO=東京 7set AFTER_STRING_TOKYO=東京,1,2 8set BEFORE_STRING_OSAKA=大阪 9set AFTER_STRING_OSAKA=大阪,10,20 10 11if exist %AFTER_CSV% del %AFTER_CSV% 12 13rem CSVから値を取得する 14call :returnFirstColumn "%AFTER_STRING_TOKYO%" TOKYO 15call :returnFirstColumn "%AFTER_STRING_OSAKA%" OSAKA 16 17( 18for /f "delims= eol=#" %%a in (%BEFORE_CSV%) do ( 19 set line=%%a 20 for /f "delims=," %%b in ("%%a") do ( 21 if "%%b"=="%TOKYO%" ( 22 echo !line:%BEFORE_STRING_TOKYO%=%AFTER_STRING_TOKYO%! 23 ) else if "%%b"=="%OSAKA%" ( 24 echo !line:%BEFORE_STRING_OSAKA%=%AFTER_STRING_OSAKA%! 25 ) else ( 26 echo %%a 27 ) 28 ) 29) 30)>%AFTER_CSV% 31exit /b 32 33rem csvの1項目目を取得する 34:returnFirstColumn 35for /f "delims=," %%i in (%1) do ( 36 set %2=%%i 37) 38exit /b

でしょうか。

引用符に囲まれたりエスケープされたりしていないカンマは、ほとんどの場所で区切り文字になるので、
1つの引数としてサブルーチンに引き渡したければ、
call :returnFirstColumn "%AFTER_STRING_TOKYO%" TOKYO
のように引用符で囲む必要があります。

投稿2021/07/23 12:13

編集2021/07/23 14:24
otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anko__

2021/07/23 13:16

ご丁寧にご確認ありがとうございます。 自分の方でひとまず動くように確認いたしました。 そのうえで処理を切り出して サブルーチン化したいと考えておりますが、 構文が間違っており、うまく値を取得することが出来ません。 バッチ初心者の為、雑な質問になってしまい 申し訳ございませんが、お力添え頂けると幸いです。 よろしくお願い致します。
otn

2021/07/23 13:34

サブルーチンの機能に何を求めているのか不明です。
anko__

2021/07/23 13:39

サブルーチン=メソッドだと認識してます。 そのため、処理の切り出しが出来ればと思ったのですが、Windowsバッチではそのような書き方は一般的でないということでしょうか?
otn

2021/07/23 13:43

そういう意味の質問じゃなくて、具体的に何の機能をサブルーチンとして切り出したいのか? ということです。
anko__

2021/07/23 13:47

下記の処理で繰り返し記述している箇所になります。 rem CSVから値を取得する for /f "delims=," %%i in ("%AFTER_STRING_TOKYO%") do ( set TOKYO=%%i ) for /f "delims=," %%i in ("%AFTER_STRING_OSAKA%") do ( set OSAKA=%%i ) 下記のイメージで切り出せればと思っております。 call :returnFirstColumn %AFTER_TOKYO% TOKYO call :returnFirstColumn %AFTER_OSAKA% OSAKA ~中略~ if "%%b"=="%TOKYO%" ( ~中略~ rem csvの1項目目を取得する :returnFirstColumn setlocal for /f "delims=," %%i in ("%1") do ( set val=%%i ) endlocal && set %2=!val! exit /b
anko__

2021/07/23 23:01

ありがとうございます。 引用符や空白の有無によって、かなり動作が変わるということを知らず、 迷走していました。 とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問