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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

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

バッチファイル

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Q&A

解決済

1回答

3987閲覧

バッチファイルでCSVの中身を置換したい

anko__

総合スコア5

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

CSV

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

バッチファイル

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

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

0グッド

0クリップ

投稿2021/07/22 03:36

編集2021/07/22 23:33

windowsバッチで下記のbefore.csvからafter.csvのように変換をしたいと考えています。
if文のところの実装方法で躓いてしまいました。

そもそも、windowsバッチでこの処理は向いていない気もしてきたのですが、
実現可能でしょうか?
ご教授いただけると幸いです。
よろしくお願いいたします。

windowsBatch

1rem test.bat 2 3rem 定義 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 11for /f "tokens=1 eol=#" %%a in (%BEFORE_CSV%) do ( 12 set line=%%a 13 if csvの一つ目の要素が東京だったら do (echo !!line:%BEFORE_STRING_TOKYO%=%AFTER_STRING_TOKYO%!!>>%AFTER_CSV%) 14 if csvの一つ目の要素が大阪だったら do (echo !!line:%BEFORE_STRING_OSAKA%=%AFTER_STRING_OSAKA%!!>>%AFTER_CSV%) 15)

csv

1#before.csv 2東京,3,4 3大阪,30,40 4

csv

1#after.csv 2東京,1,2,3,4 3大阪,10,20,30,40

追記
上記の処理で「csvの一つ目の要素が東京だったら 」としていた箇所を
「AFTER_XXXのCSVの一つ目の値とBEFORE_XXXの要素が一致している場合」
として汎用的に処理を書きたいと思っています。
下記のイメージで出来ると思ったのですが、
サブルーチンからうまく値を取得できません。
たびたび申し訳ございませんが、ご教授いただければ幸いです。
(AFTER_XXXはconfファイルへ外だしする予定の為、名称が変わった場合に改修を容易にしたいという背景です。)

windowsBatch

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

いろいろ文法的におかしい点があります。ifdoとか。

文字列を、特定文字で区切るには、"で囲んでfor /f "delims=,"の機能を使います。

CMD

1@echo off 2setlocal enabledelayedexpansion 3rem 定義 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 11( 12for /f "delims= eol=#" %%a in (%BEFORE_CSV%) do ( 13 set line=%%a 14 for /f "delims=," %%b in ("%%a") do ( 15 if "%%b"=="東京" ( 16 echo !line:%BEFORE_STRING_TOKYO%=%AFTER_STRING_TOKYO%! 17 ) else if "%%b"=="大阪" ( 18 echo !line:%BEFORE_STRING_OSAKA%=%AFTER_STRING_OSAKA%! 19 ) else ( 20 echo %%a 21 ) 22 ) 23) 24)>%AFTER_CSV%

投稿2021/07/22 04:11

otn

総合スコア84551

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

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

anko__

2021/07/22 23:34

ご回答ありがとうございます。 とても助かりました。 変数を文字列に変換できることすら知らず、苦戦しておりました。 質問を追記させていただいたので、 お時間ありましたらご回答いただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問