• ベストアンサー

特定文字列の次のトークンを取り出す

バッチにて、以下文字列内のFROM以降の文字列の抽出を行いたいと考えてます。 <chusyutu.txt> FROM hogehoge FROM hogehoge pekepeke FROM hogehoge     ・     ・     ・ その場合、 for /f "delims=FROM" %%i IN ("chusyutu.txt") do (echo %%i >> result.txt) としてましたが、一部文字列が抽出できておらず、"ECHO は <OFF> です。"と表示されてしまって おります。上記、構文に問題ありますでしょうか。お教えて頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

delims=FROM は、FROMと言う文字列を区切りにするという意味ではありません。 FとRとOとMを区切りにするという意味です。 また、for /f ~ in ("chusyutu.txt") do ~ は、chusyutu.txt というファイルの内容を読み出すという意味ではありません。chusyutu.txt という文字列を処理するという意味です。ファイル名を" "で囲みたいときは、usebackq を指定します。 FROMまでの文字列を削除するときは、%A:*FROM=% のようにします。 @echo off (for /f "usebackq delims= eol=" %%A in ("chusyutu.txt") do call :SUB "%%A")>result.txt goto :EOF :SUB set A=%~1 echo %A:*FROM =%

b3b1on
質問者

お礼

回答ありがとうございました。 delimsの認識に誤りがありました。 頂いた内容で行ったところ、無事抽出できました。 ありがとうございました。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

delims=FROM は、区切り文字を F または R または O または M にするということです。 また、for ~ in ("chusyutu.txt") do ~ は、chusyutu.txt のファイル内容を読むのでなく、chusyutu.txt という文字列自体を処理対象にします。ファイル名を " " で囲いたいのなら、usebackq が必要。 @echo off (for /f "usebackq delims= eol=" %%A in ("chusyutu.txt") do call :SUB "%%A")>result.txt goto :EOF :SUB set A=%~1 echo %A:*FROM =%

b3b1on
質問者

お礼

回答ありがとうございました。 delimsの認識に誤りがありました。 ご指摘ありがとうございました。

  • kteds
  • ベストアンサー率42% (1882/4440)
回答No.1

一度ではムリでしょうから、抽出結果をさらに下記のように処理すればいいでしょう。 デリミッタはスペースとして出力結果は文字をつなげる。 tokenが2つあるので、出力に%%j を付けていることに留意。 for /f "tokens=2,3 delims= " %%i IN (chusyutu.txt) do echo %%i%%j >> result.txt 結果はFROMという余計なデータが付いたデータが存在するので下記でカットする。 デリミッタは余計な文字である FROM とする。 for /f "tokens=1 delims=FROM" %%i IN (result.txt) do echo %%i > result-new.txt

b3b1on
質問者

お礼

詳細なご説明、並びに構文までご提示頂き、ありがとう ございました。無事、解決できました。

関連するQ&A