2017-07-07 17 views
0

私はBatch file to filter strings from text and replace... but in a single batch instead of multiple?に基づいていますが、それでもやり方は分かりません。Windowsバッチはtxtファイルを読み込み、行をフィルターに掛けて別のファイルに出力します

固定の列にデータを格納した入力txtフラットファイルがあります。このファイルの行ごとにWindowsのバッチを読む必要があります。特定の列で、値が特定のものであれば、その行を出力ファイルに出力する必要があります。入力ファイルにはヘッダーがありませんので、心配する必要はありません。

AAAA 1111 jjjjj 
CCCC 1111 llll 

を作成するコードは何:新しいファイルが持っている必要がありますので、私は、その2列1111ある行をフィルタリングする必要が

AAAA 1111 jjjjj 
BBBB 2222 kkkkk 
CCCC 1111 llll 

:例では

は、それは3つの列を持っていると言いますこのフィルタを使用して出力ファイルに出力しますか?

答えて

1

8列目またはそれ以前のフィルタリングをしている限り、必要なのは、適切に構成された正規表現を持つ単一のFINDSTRコマンドだけです。 FINDSTR正規表現のサポートは非​​常に限定されており、非標準であることに注意してください。ここで

あなたの質問の例のためのソリューションです - 第二欄に1111をマッチング:ここ

findstr /rc:"^[^ ][^ ]* *1111 " input.txt >output.txt 

は、それが5列

findstr /rc:"^[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *1111 " input.txt >output.txt 

で1111年に合わせて、どのようになるかでありますFINDSTRが最大15文字クラス([x])の用語に制限されているため、9番目以降の列でフィルタリングしようとすると失敗する理由があります。詳細については、What are the undocumented features and limitations of the Windows FINDSTR command?を参照してください。

より堅牢な代替手段は、私のJREPL.BAT regex utilityを使用することです。 JREPLは、XP以降の任意のWindowsバージョンで動作する純粋なスクリプト(ハイブリッドバッチ/ JScript)です。サードパーティのexeファイルは必要ありません。

jrepl "^\S+\s+1111\s" "" /k 0 /f input.txt /o output.txt 

あなたの代わりに2列目の25日の欄に1111と一致したい場合は、JREPLソリューションは次のようになります。

jrepl "^(\S+\s+){24}1111\s" "" /k 0 /f input.txt /o output.txt 

JREPLは、バッチスクリプトがあるので、あなたが使用する必要があります別のバッチスクリプト内にコマンドを置くと、JREPLが呼び出されます。

+0

ありがとうございます。残念ながら、実際のファイルは8列目でフィルタリングされなければなりません。また、findstrで 'FINDSTR:検索文字列が長すぎます 'というエラーが発生しました。 – Hikari

+0

私はjreplを試しましたが、処理するファイルを探すためにFORを実行し、%% fをパラメータとして渡す必要があります。最初の反復は機能しますが、2番目の処理ではコードが処理される代わりにエコーされ、FORが終了するとスクリプトは終了せずに終了します。私はいくつかのテストを行いましたが、失敗の理由を説明しています。 – Hikari

+0

@ひかり - 私が指示したようにCALL JREPLの使用に失敗したようです。 JREPLはバッチスクリプトなので、別のバッチスクリプトにコマンドを含めるには、CALL JREPLを使用する必要があります。 – dbenham

関連する問題