「csvファイルを検索して文字列抽出したい」

このQ&Aのポイント
  • Windows2000の環境で、「,」区切りのcsvファイルを検索して文字列を抽出したいです。
  • バッチファイルに引数を渡してcsvファイルを検索し、検索文字列と引数が一致すれば文字列をセットする方法を試していますが、うまくいきません。
  • セットされた文字列が引数と異なる場合はエラーとして処理したいのですが、セットされた文字列が意図しない値になってしまいます。助言をお願いします。
回答を見る
  • ベストアンサー

「,」区切りのcsvファイルを検索して文字列抽出したい

環境:windows2000 csvファイル形式: pat,\path1\path2,\path\path3 pat_a,\path4\path5,\path7\path8 pat_a,\path7\path6,\path8\path9 バッチファイルに引数%A%を渡してcsvファイルを検索します。 検索文字列は引数%A%です。一行目に検索しようとする文字列があると それを%%Jにset してあげます。最後に渡された引数とセットされた文字列が同じであればOKです。 自分で考えたのですがなかなかうまくいきません。 みなさまのご教授おねがいします。 FOR /F "tokens=1 delims=," %%l in ('findstr /R "%1" rrr.csv') do set palam=%%l echo "渡された引数 [%1] " echo "セットされた文字列 [%palam%] " if "%palam%" NEQ "%1" ( goto :erro_end ) 引数は「pat」を渡したのですがセットされた文字列が「pat_a」 になってしまうんです。

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.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 が代入されます。

roba1234
質問者

お礼

こんなにやさしく説明までつけてくれてほんとうにありがとうございます。 お勉強になりました。いつになると私も...できるかな?

その他の回答 (2)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

No.1です。 せっかく findstr で正規表現の /R を指定しているので、 FOR /F "tokens=1 delims=," %%l in ('findstr /R "^%1," rrr.csv') do set palam=%%l と行頭を指定する^を入れた方が確実かもしれませんね。

roba1234
質問者

お礼

ありがとうございます。本当にできました。 でも引数の後ろに"^%1," カンマをつけるのはどんな理由ですか? "...delims=,"のdelimsがカンマをスペースに置き換えてくれるからですか? よろしければ理由も知りたいですが。。。 口でしかお礼ができなくて本当にごめんなさい。

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

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の後ろに,(コンマ)を加えています)

関連するQ&A

  • csvファイルを開かずに文字を検索し行を抽出したい

    フォルダの中に複数のCSVファイルが有ります。 これらのファイルを開かずに文字列を検索し、検索対象の文字と完全一致する 文字がある行をまとめてひとつのファイルに抽出する方法を探しています。 例:Aフォルダ内にファイル1、ファイル2、ファイル3、、、と複数のファイルがある。 ファイルのフォーマットはすべてCSV。ファイルにはシートは一つのみ。日付なのですべて異なります。       A         B  C   D   E   F  G   H   I   J  K   L 加工年月日時分 品種 コード A列 B列 C列 D列 E列 F列 G列 本数 作業者    ・    ・    ・ A~Lまであり、Cのコードが指定した検索文字と完全一致するものを抽出したいです。 急ぎの内容の為、VBAやコマンドプロンプトなど、自分なりに色々なサイトにある プログラムを組み換えようとしましたが初心者の為すぐに理解して応用はとても 無理でした。知恵を貸して頂きたいです。

  • バッチファイルでFINDSTRを使って文字列検索をしたいが、ファイルが

    バッチファイルでFINDSTRを使って文字列検索をしたいが、ファイルが開けない (1)と(2)のバッチファイルを作りました。それぞれ単体で実行すると、エラーは出ません。 (1)と(2)を一緒にした(3)というバッチファイルで実行すると、FINDSTRのところで、 「ファイルを開くことができません」というエラーが出て、途中でとまってしまいます。 エラーを出さずに実行する方法は何かないでしょうか? (A.batは、CドライブにあるWord.exeを実行するだけのバッチファイルです。) どうぞよろしくお願いします。 【(3)の中身】 call A.bat >kekka.txt   ←この1行だけが(1)のバッチファイルの中身です GOTO kensaku GOTO :EOF ::文字列検索 :kensaku SET keyword=作成しました。   ←この行から下が(2)のバッチファイルの中身です FINDSTR %keyword% kensaku.txt > NUL GOTO kekka%ERRORLEVEL% GOTO :EOF :kekka0 REM 文字列あり ECHO %keyword%がありました PAUSE > nul GOTO :EOF :kekka1 REM 文字列なし ECHO %keyword%はありませんでした。 PAUSE > nul GOTO :EOF

  • 検索文字列以外のファイル

    テキストファイルの中身を検索して、その文字列以外のファイル名を取りたいのです。具体的には、 【A.txtの中身】 123 abc 【B.txtの中身】 111 abc 【C.txtの中身】 222 abc このようなテキストファイルの中身を検索して、文字列「123 abc」以外が書かれているファイル名(つまり、B.txt、C.txt)を取得したいのですが、findstrやForなどを駆使すれば、できますでしょうか?

  • csv ファイルのデータを文字列として開く

    csv ファイルを開いた時に、最初から 全てのセルの 「セルの書式設定 > 分類」を「文字列」にすることは出来ますか? 一度、拡張子を txt に変えて 「テキスト ファイル ウィザード」 「列のデータ形式」を文字列にするのは知っているのですが、 ・拡張子を変える ・エクセルを開く ・ファイルを選ぶ ・全ての列を選択 ・文字列にする と非常に面倒なので csv ファイルのままでファイルを開いたら 最初から文字列にする方法を探してます。 お願いします。

  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • 複数の文字列を検索

    あるログファイルの文字列を取得して。検索でヒットした文字列行 を返すスクリプトを作成しております。 検索:"OK"    日付 対象行 : OK! Tue Jul 19 文字列"OK"は普通に # grep "OK" ログファイルPath で検索できますが、 文字列と日付を両方引っ掛ける場合は・・・ grep -e "OK" -e env LANG=c date -u +"%a %b $d" ログファイルPath 当然コマンドエラーになります。 dateコマンドから日付を取得して、grepにて引っ掛ける方法を知りたいので すが、お分かりになる方、ご教授お願い致します。

  • 文字列取得

    '/path1/path2/file1.txt' '/path1/path2/path3/file2.txt' 上記のようなpathがあった場合にファイル名(拡張子なし)の 文字列を取得したいのですがどのように良いでしょうか? 宜しくお願い致します。 awkで$4と指定すれば「file1.txt」の文字列を取得できるのですが パスの長さが定まっていないため$4ではなく最後の文字と指定する 記号はないでしょうか? echo /path1/path2/file1.txt |awk '{FS="/"; print $4}'

  • Fileから文字列を抜き出したい

    CGIのプログラムで行ったほうがいいに決まっていますが、JavaScript で行うことを前提にした質問です。 下記の構造をしているファイルAから、各行の先頭の文字列 を抜き出して、引数で与えた文字列と一致するかチェックした いのです。 例えば、ファイルAの構造が区切り、|で  ”ローソン”|”ワイン”|”450”  ”サークルK”|”日本酒”|”180”  ”セブンイレブン”|”ワイン”|”430” となっており引数がセブンイレブンの時、3行目に一致する ので、TRUEを返す関数を作りたいのです。

  • エクセル マクロ 文字列の検索と抽出

    エクセル2010を使っています。 画像の様に、【Sheet3】のA列~CQ列に 空白・エラー・数値・文字 の入った表があります。 そのL列には、画像の様な形で様々な地域の名前が入っています。 やりたいのは、L列に 検索対象文字が複数、例えば 福岡 か 大阪 が入っていたら、その表ごと抽出し、【Sheet1】の上から順に枠線ごと貼り付けて行きたいと思います。 この時、両方一致ではなく、検索対象の文字列が一つでも含まれていたら抜き出したいと思います。 その時に 【Sheet3】から抽出した部分は削除し、上に詰めて行きたいと思います。 ちなみに検索対象が、福岡・大阪・名古屋等、増える場合もありますので、増えたとき対応が出来る形が理想です。 ちなみにL列の文字と文字の間は ・ だったり / だったりします。 詳しい方、よろしくお願い致します。

  • 巨大なCSVの加工(指定列のみの抽出)について

    巨大なCSVの加工(指定列のみの抽出)について 下記のような構成のCSVファイルがあります。 "ID","a","b","c","d","e","f","g","h","i","j","k","l","m" "0001","a","b","c","d","e","f","g","h","i","j","k","l","m" "0003","a","b","c","d","e","f","g","h","i","j","k","l","m" "0004","a","b","c","d","e","f","g","h","i","j","k","l","m" ・ ・ ・ 例えば、 ここから"ID"列と"c"列と"f"列のみ抽出して新たなCSVファイルで保存。 という処理を行いたいのですが、行数が5000万行近くあり、ファイルサイズが80GB程あるので エクセルはおろかアクセスでも開くことができません。 テキストエディタの秀丸64bit版なら開くことができますが、指定列の抽出方法が分かりません。 秀丸のマクロでもVBSでも良く、また膨大な待ち時間がかかっても構わないので実現する方法について お知恵をお貸しください。

専門家に質問してみよう