- ベストアンサー
テキストの文字を抜き出す方法
お世話になっております。 テキストに記載されている文字を、特定の開始文字列から終了文字列まで抜き出したいと思っております。また、抜き出したテキストは別のフォルダに保存する設定を考えてます。 例えば、 --------------------------------------------------------------- aaaaaa11111 bbbbb22222 c333 d4444 e55555 --------------------------------------------------------------- と書かれていた場合、bからdまでの文字列だけを抜き出したいのです。 その作業をバッチファイルで作成したいと思っており、Webで調べると下記のコマンドで実行が出来そうなのですが、私にはちょっと複雑すぎて困っています。 @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION (FOR /F "delims=[] tokens=1*" %%0 IN ('FIND /N /V ""') DO ( IF "!FLAG!"=="1" SET FLAG=2 IF "!FLAG!"=="3" SET FLAG=4 SET "LINE=%%1" SET "LINE=!LINE:%1=!" IF NOT "!LINE!"=="%%1" SET FLAG=1 SET "LINE=%%1" SET "LINE=!LINE:%2=!" IF NOT "!LINE!"=="%%1" SET FLAG=3 IF "!FLAG!"=="1" ECHO=%%1&rem IF "!FLAG!"=="3" ECHO=%%1&rem IF "!FLAG!"=="3" GOTO :EOF IF "!FLAG!"=="2" ECHO=%%1 ) )<%3 bからdまでを指定する場合、どのように指定すればいいのでしょうか? また、抜き出したテキストを別のフォルダに保存する為のコマンドもご教授願えませんでしょうか? よろしく御願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こういう飛び道具を使ってもいいのなら、バッチファイルでできなくもありません。 @if (0)==(0) echo off cscript.exe //nologo /e:jscript %~f0 %1 exit /b @end var oArgs = WScript.arguments; var oFileSys = new ActiveXObject("Scripting.FileSystemObject"); var filename = oArgs(0); //処理対象のファイル var record; var oFin; //読み込み 1 //書きこみ(上書きモード)2 //書きこみ(追記モード) 8 var do_output = false; var start_pat = /^b/; var end_pat = /^d/; try { oFin = oFileSys.OpenTextFile(filename, 1); do { record = oFin.ReadLine(); if (start_pat.test(record)) { do_output=true; } if (end_pat.test(record)) { WScript.echo(record); do_output=false; } if (do_output == true) { WScript.echo(record); } } while(oFin.AtEndOfStream==false); oFin.Close(); } catch(e) { WScript.echo(filename + "が開けませんでした。" + e); } oFileSys = null; oFin = null; 上記の一見 jscriptなものを、.bat の拡張子を持つファイルに コピペするときちんとバッチファイルとして動作します。 ただ、これは単にコンソールに出力するだけです。
その他の回答 (4)
- sakusaker7
- ベストアンサー率62% (800/1280)
すみませんちょっと間が空きました。 > 固定にせずにこのままバッチファイルを走らせた場合、処理対象のファイルは最終的にはどこを参照するのでしょうか? たとえばあの内容を hoge.bat というファイルにして、 c:\user\bps というディレクトリで hoge data.txt というように実行したら、探しに行くのは c:\user\bps\data.txt だけです。 hoge c:\users\admin\data.txt のように指定したらそこで探します。 > var filenameを固定にして、var start_patとvar end_patに指定の文字を全て記載させた状態でバッチファイルを動かすと、 >「windows jscript コンパイル エラー(16,21) '/'がありません。」 > と表示されてしまい、バッチファイルが動きません・・・ んー、どういう風に行を変えましたか? 前後にある / にはさまれたものが正規表現であるという約束になっているので、 v = ^d; のようには書けません。 正規表現を作るのには、 v = RegExp("^yyy"); のようにも書けますので、/ を含む文字列で検索したいなら こっちを使うといいかもしれません。
お礼
お忙しい中、ご回答下さり感謝してもしきれません。 すごく解りやすく説明して頂いて有難う御座いました。 >んー、どういう風に行を変えましたか? >前後にある / にはさまれたものが正規表現であるという約束になって>いるので、 >v = ^d; >のようには書けません。 正規表現に関して、参考書を購入して見ていたのですがsakusaker7さんのご指摘通りでした。/コメント/とならなければエラーが表示されてしまうんですね・・・ もっと、正規表現について勉強します。 正規表現だけではなく、スクリプト全般に時間をかけてプログラムに強くなっていきたいと思います。本当に有難う御座いました。 #でも、また困ったらここで質問をしてしまいそうですが('';
- sakusaker7
- ベストアンサー率62% (800/1280)
別に謙遜とかそういうことではなく、書こうと思えばファイル出力部分も 書けたけど面倒なのでやらなかった。 でも、抜き出しのところはやったからいいでしょ? ということで、「コンソールに出力するだけ」のものですよ という断り書きのつもりでした。 で、 > ファイルの指定箇所は、 > var filename = oArgs(0); //処理対象のファイル > だと思うのですが、//のあとにC:\aaa\bbb\ccc.txtという感じで記載すれば良いのでしょうか? バッチファイルの引数としてファイルの名前を与えられるようにしたのですが、 固定でいいのなら var filename = "c:\aaa\bbb\ccc.txt"; のようにしてください。 >また、開始文字列および終了文字列の行数指定をする時、 > var do_output = false; > var start_pat = /^b/; > var end_pat = /^d/; > 上記の/^[開始文字列]/;~/^[終了文字列]/;を指定をすれば、 > 質問の例題以外に検索をした場合も同じという理解であっていますか? はい。 正確にいうとこれは「正規表現」なので 文字列とはちょっと違います。 上記の例でいうと、 行が b で始まっていたら開始、 行が d で始まっていたら終了 としています。 jscriptは VBScript/JScriptプログラミング&Tips for WSH - cafe de VBS http://www.happy2-island.com/vbs/ この辺を見ると情報が得られると思います。 Microsoftのサイトにあるリファレンスでもいいですけど ちょっと参照しにくいつくりです。
お礼
ご回答有難う御座います。 WEBや参考書を調べても、まだわからない部分が・・・すみません。 >var filename = oArgs(0); //処理対象のファイル >バッチファイルの引数としてファイルの名前を与えられるようにしたのですが、 の箇所なのですが、固定にせずにこのままバッチファイルを走らせた場合、処理対象のファイルは最終的にはどこを参照するのでしょうか? あともう一つ質問があります。 var filenameを固定にして、var start_patとvar end_patに指定の文字を全て記載させた状態でバッチファイルを動かすと、 「windows jscript コンパイル エラー(16,21) '/'がありません。」 と表示されてしまい、バッチファイルが動きません・・・ これで最後の質問にします。あとは自力で解決してみます。
(回答の「種類」に適当なのが無くて・・) No1です。 >>バッチファイルでは「できない」と思います。 ↑早々に撤回します。失礼しました。 それにしても、No2さん、すごいですね。 年寄りの脳みそがジンジン(?)してます。 こんなん初めて見ます。 b,d の行は抽出できるのかな?とはなんとなく思い(?)ますが、 c の行も抽出できるとは・・・う~ん、新しいこと覚えるのオックウだな。 >ただ、これは単にコンソールに出力するだけです。 なにを謙遜されているんですか?。 リダイレクトでファイルに吐き出せましたよ。 >sakusaker7.bat test.TXT > New.TXT (蛇足?) あらかじめ、sort org.txt > test.TXT を実施しておく。
お礼
>(回答の「種類」に適当なのが無くて・・) > >No1です。 >>>バッチファイルでは「できない」と思います。 >↑早々に撤回します。失礼しました。 恐らく、バッチファイルとスクリプトの混合技?だと思われるので異例なのかもしれません・・・ 私はチンプンカンプンなので理解しようとするのに知恵熱が出まくりで、こめかみ辺りが痛いです。。。難しいorz 私もリダイレクトでファイルに吐き出せるか試してみます。 しかし、バッチファイルの奥深さとスクリプトの難しさを垣間見ました。
(ご質問の主旨が判りかねます。★補足をお願いします) aaaaaa11111 bbbbb22222 c333 d4444 e55555 という5レコード(行)からなる【ファイル】を開き、「条件」を基に、その2行目から4行目までを抜き出し、 bbbbb22222 c333 d4444 の3行からなる新たな【ファイル】を作成する、ということですよね。 ↑ここまでの私の解釈に「誤り」はありますでしょうか。 ★補足をお願いします。 私の解釈に「誤り」が無い場合、 >その作業をバッチファイルで作成したいと思っており バッチファイルでは「できない」と思います。 なお、 >別のフォルダに保存する copy コマンドを使い「別のフォルダに保存」し、コピー元ファイルを del コマンドで削除することで可能です。 (【ファイル・フォルダ】以外は「フォルダに保存」できません)
補足
補足が遅くなってしまい申し訳ありません。 yama3092さんの解釈で間違いありません。 2行目(開始文字列)から4行目(終了文字列)までを抜き出し、別フォルダを作成し、抜き出したファイルを保存するのが主な目的です。 >私の解釈に「誤り」が無い場合、 >>その作業をバッチファイルで作成したいと思っており >バッチファイルでは「できない」と思います。 > >なお、 >>別のフォルダに保存する >copy コマンドを使い「別のフォルダに保存」し、コピー元ファイル >を del コマンドで削除することで可能です。 >(【ファイル・フォルダ】以外は「フォルダに保存」できません) 例えば、copyコマンドで2行目の開始文字列から4行目の終了文字列だけをコピーし、新たにファイルを作成して張り付ける事は可能でしょうか・・・?うーん。
お礼
うーん・・・ 私がもう少しスクリプトやバッチファイルの腕があれば、回答を頂いた事が理解出来るのでしょうけど、まだレベルが低いのでわかりません。 ファイルの指定箇所は、 var filename = oArgs(0); //処理対象のファイル だと思うのですが、//のあとにC:\aaa\bbb\ccc.txtという感じで記載すれば良いのでしょうか? また、開始文字列および終了文字列の行数指定をする時、 var do_output = false; var start_pat = /^b/; var end_pat = /^d/; 上記の/^[開始文字列]/;~/^[終了文字列]/;を指定をすれば、質問の例題以外に検索をした場合も同じという理解であっていますか? すみません。補足をしたいのですが内容が高度なので・・・