3

ms-dos コマンド findstr を使用して文字列を検索し、ファイルから削除しようとしています。

現時点では、明示的な文字列を見つけることができますが、正規表現に本当に苦労しています。ファイルは次のようになります。

PLs - TULIP Report  
Output_Format, PLS - TULIP REPORT  
NUMLINES,    110907
VARIABLE_TYPES,T1,T8,I,T9,T2,N,N,N  
[[data below]]

このファイルは一部のシステムからエクスポートされたものであり、そのヘッダーが含まれているため、SQL Loader を使用して Oracle データベースに取り込む前にクリーンアップしたいと考えています。

ファイルは 1 つだけではなく、すべて同じタイプのヘッダーを持ちますが、すべてのファイルでわずかに異なります。ハードコードされた値を使用して最初の 2 行を最初に削除しても問題ありませんが、次のようになります。

findstr /v "PLs - TULIP Report" "c:\myfiles\file1.PRO"  > "c:\myfiles\file1.csv"</code><br>
findstr /v "Output_Format, PLS - TULIP REPORT" "c:\myfiles\file1.csv" > "c:\myfiles\file2.csv"

(2つのステップでそれを行う方法に注意してください-これを1つのステップで実現するための提案があれば、大歓迎です)

3行目は私にとっては複雑ではありません.常にその形式になります:

NUMLINES,    110907

ただし、最後の番号はファイルごとに異なります。では、正規表現を使用してこの行全体を見つけるにはどうすればよいでしょうか? 私が試してみました:

findstr /v /b /r "\D+ \s+ \d+"

しかし運がない。

参考までに、データは[[data below]]次のようになります

*,"00000161",456823,"017896532","FU",23.95,3.34,20.61

etc .. 明らかに、データ領域を変更したくありません。

上記が理にかなっているといいのですが、

ありがとう

4

2 に答える 2

1

単一の行を除外する必要がありfindstrます。複数の行に一致させることはできません。異なる正規表現をスペースで区切るだけです

findstr /r /b /v "NUMLINES PLs Output_Format" *.txt 
                  ^regex1  ^2  ^3

指定/bすると、行の先頭でのみ一致を検索し、/vそれらの行を除外できます。

編集:

使い方はもちろん

 findstr /r /b /v "NUMLINES PLs Output_Format" yourfile > yourtarget

そして、正規表現によって除外された行以外のyourtargetデータが見つかります。yourfile

編集2:

コメントに基づいてVARIABLE_TYPES、正規表現に追加するだけで済みます

findstr /r /b /v "NUMLINES PLs Output_Format VARIABLE_TYPES" yourfile > yourtarget

これは、1 つの命令で操作全体を完了する方法です。

于 2012-10-23T11:19:38.463 に答える
0

これは、4 行すべてを除外する正規表現を使用した 1 つのライナーです。(コードの見栄えを良くするために、行の継続を使用しました。) 各行は正確に一致する必要があります。あなたの形式がよくわからなかったので、各行は任意の数のスペースで終わることができます。注 - FINDSTR 正規表現のサポートは非​​常に限定されており、標準ではありません。他にも多くの FINDSTR の癖とバグがあります。Windows FINDSTR コマンドの文書化されていない機能と制限事項は何ですか? を参照してください。詳細については。

findstr /vrx /c:"PLs - TULIP Report *"^
             /c:"Output_Format, PLS - TULIP REPORT *"^
             /c:"NUMLINES, *[0-9]* *"^
             /c:"VARIABLE_TYPES,T1,T8,I,T9,T2,N,N,N *"^
        "c:\myfiles\file1.PRO"  >"c:\myfiles\file1.csv"

最初の 4 行をスキップするだけであれば、通常は MORE を使用できるはずです。しかし、大きなファイルで MORE がハングする状況がいくつかありますが、詳細を思い出せません。また、MORE はタブを一連のスペースに変換します。

more +4 "c:\myfiles\file1.PRO"  >"c:\myfiles\file1.csv"

もう 1 つのオプションは、FOR /F ループを使用することです。FOR /F は空行をスキップしますが、それは気にする必要はないと思います。

>"c:\myfiles\file1.csv" (
  for "usebackq skip=4 delims=" %%A in ("c:\myfiles\file1.PRO") do echo(%%A
)

データのいずれかが a で始まる;場合、コードは少し醜くなります。次に、EOL オプションを改行文字に設定して無効にします。

set LF=^


::above 2 blank lines are critical - do not remove
>"c:\myfiles\file1.csv" (
  for usebackq^ skip^=4^ eol^=^%LF%%LF%^ delims^= %%A in ("c:\myfiles\file1.PRO") do echo(%%A
)
于 2012-10-23T14:38:56.420 に答える