- ベストアンサー
「csvファイルを検索して文字列抽出したい」
- Windows2000の環境で、「,」区切りのcsvファイルを検索して文字列を抽出したいです。
- バッチファイルに引数を渡してcsvファイルを検索し、検索文字列と引数が一致すれば文字列をセットする方法を試していますが、うまくいきません。
- セットされた文字列が引数と異なる場合はエラーとして処理したいのですが、セットされた文字列が意図しない値になってしまいます。助言をお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
カンマをつけてうまくいく理由は、 FOR /F "tokens=1 delims=," %%l in ('findstr /R "^%1," rrr.csv') do set palam=%%l が処理されるとき、まず findstr /R "^%1," rrr.csv の部分が処理されるからです。この時点ではまだカンマでは区切られず、 pat,\path1\path2,\path\path3 pat_a,\path4\path5,\path7\path8 pat_a,\path7\path6,\path8\path9 が findstr にそのまま渡されます。したがって、pat だけで検索すると、pat も pat_a も該当してしまいます。 しかしCSVファイルなので、最初の項目の次には必ずカンマが来ることを利用して、 pat, で検索すると、1行目だけが該当します。 この結果が FOR 文の中で展開され、 FOR /F "tokens=1 delims=," %%l in ("pat,\path1\path2,\path\path3") do set palam=%%l のようになり、ここではじめて delims=, が効いてカンマで区切られ、palam に pat が代入されます。
その他の回答 (2)
- ham_kamo
- ベストアンサー率55% (659/1197)
No.1です。 せっかく findstr で正規表現の /R を指定しているので、 FOR /F "tokens=1 delims=," %%l in ('findstr /R "^%1," rrr.csv') do set palam=%%l と行頭を指定する^を入れた方が確実かもしれませんね。
お礼
ありがとうございます。本当にできました。 でも引数の後ろに"^%1," カンマをつけるのはどんな理由ですか? "...delims=,"のdelimsがカンマをスペースに置き換えてくれるからですか? よろしければ理由も知りたいですが。。。 口でしかお礼ができなくて本当にごめんなさい。
- ham_kamo
- ベストアンサー率55% (659/1197)
findstr で pat を検索したら、pat_a もヒットしてしまいますよね。 その結果FOR文が rrr.csv の1行目から3行目までまわってしまい、最後の3行目の pat_a がpalam にセットされているのでしょう。 コンマをデリミタとして使っているので、 FOR /F "tokens=1 delims=," %%l in ('findstr /R "%1," rrr.csv') do set palam=%%l とすればいかがでしょうか。(%1の後ろに,(コンマ)を加えています)
お礼
こんなにやさしく説明までつけてくれてほんとうにありがとうございます。 お勉強になりました。いつになると私も...できるかな?