質問: バッチファイルでテキストファイルの中身を取得します。 テキストファイルはカンマ区切りでレコードによっては値の入らないフィールドがあります。 問題は、値の入らないフィールドがフィールドが存在する場合、そのレコードのそれ以降のフィールドが ズレて取得されてしまう点です。 例えば、下記のテキストファイルの中身を取得する場合、 > > 【テキストファイル(data.txt)の内容】 > > 名前,部署1,部署2,役職,年齢 > > 山田,営業1課,営業2課,社員,25, > > 鈴木,営業1課,,係長,30, > > . > > . > > . > > > 「役職」項目を取得します。 ``` rem 「山田」の役職を取得 for /f "tokens=1-5 delims=," %%i in ('findstr "山田", data.txt') do ( echo %%l ) ``` 以下の様に出力されます。 ``` 【結果】 社員 ``` しかし、「鈴木」レコードで「役職」項目を取得する場合は ``` rem 「山田」の役職を取得 for /f "tokens=1-5 delims=," %%i in ('findstr "鈴木", data.txt') do ( echo %%l ) ``` 以下の様に出力されます。 ``` 【結果】 30 ``` 「鈴木」レコードでは部署2がnullのため変数%%lに値がセットされず、年齢がセットされました。 改善方法としてはテキストファイルの「,,」を「,null,」と書き換えれば正常動作をしますが、 可能であれば元のテキストファイルの形式を崩さずに、「,,」と区切り文字が続くフィールドがあっても、そうでないフィールドと同じ変数にセットしたいです。 ご存知の方、お教え頂けますでしょうか?
回答: ``` rem 全員の役職を表示 for /f "tokens=*" %%A in ('findstr "," data.txt') do call :SUB "%%A" exit /b :SUB set B=%1 :LOOP set A=%B% set B=%A:,,=,NULL,% if not %A% == %B% goto LOOP for /f "tokens=1-5 delims=," %%i in (%B%) do ( echo %%l ) exit /b ```