2012-03-30 8 views
0

は、この違いを示していますフィルタリングファイルと(コマンドプロンプト)を一緒に一定のラインを連結

findstr /r "^[0-9][0-9]*.*$" filter.tmp > filter-numbers.tmp 
findstr /r "^[^0-9][^0-9]*.*$" filter.tmp > filter-text.tmp 

私がするために必要なものやる一緒にこのようなテキストを含む行を追加し、行番号が含まれていない場合だけ出力ファイルにそれを置くことです:

Hello 
World 
Foo 
Bar 
45: this is some line 
Trouble 
with code 
66: another line 
012:

IF "current line" contains text THEN 
previous line = concatenate "previous line" + "/" + "current line" 
ELSE 
echo "previous line" >> filter.out 
echo "current line" >> filter.out 

filter.tmpのようなものが含まれています

filter.outは、次のようになります。私は実現

Hello/World/Foo/Bar 
45: this is some line 
Trouble/with code 
66: another line 

、これは非常に単純ですが、私はちょうどそれが働いて得ることができません。私はそれについて考えているので、C++を使用するほうがはるかに簡単です。

+0

? –

+0

私は、C++のソリューションはバッチファイルより複雑かもしれないと思います。しかし、それは理解しやすいかもしれません。 – Joey

+0

バリC、私は望んでいたが、ワークステーションにIDEがインストールされていなかったので、インストールできなかったのでユーザの権利が限られていた – rluks

答えて

1

これは、»が本当に意味する数字を含んでいるという前提に基づいて、あなたの擬似コードと正規表現を翻訳したものです2桁«(これはあなたの正規表現が示すものです):

@echo off 
setlocal enabledelayedexpansion 
set Prev= 
for /f "delims=" %%x in (filter.tmp) do (
    set "Line=%%x" 
    if "!Line:~0,2!" GEQ "00" if "!Line:~0,2!" LEQ "99" (
     if not "!Prev!"=="" (>>filter.out echo !Prev!) 
     >>filter.out echo !Line! 
     set Prev= 
    ) else (
     if "!Prev!"=="" (set "Prev=!Line!") else (set "Prev=!Prev!/!Line!") 
    ) 
) 
if not "!Prev!"=="" (>>filter.out echo !Prev!) 

これはいくつかを使用しています。まず最初に、ループ内で環境変数を操作できる遅延展開が必要です。次に、ファイル内の行をfor /fで繰り返します。これはファイル内の空行をスキップしますが、それを避けることはできません。 for /fループ内では、変数Lineには現在の行が格納され、前の行にはPrevが格納されています。私はthenelseの条件の分岐を入れ替えました。なぜなら、行頭の数字は非数字よりも簡単にチェックできるからです。

echoでは、リダイレクトを行の先頭に移動したことがわかります。 PrevまたはLineの末尾の数字がリダイレクトに影響を及ぼさないようにします(末尾のスペースを避けるため)。

あなたはPowerShellのに有害でないなら、あなたは以下を使用することができます。

その後、C++を使用しないのはなぜ
$(switch -Regex -File filter.tmp { 
    '^\D' { if ($prev) { $prev += "/$_" } else { $prev = $_ } } 
    '^\d{2}' { if ($pref) {$prev}; $_; $prev = '' } 
} 
if ($prev) { $prev } 
) | Set-Content filter.out 
+0

ありがとうJoye、変数が設定されていないエコーに問題がある。 filter.outのメッセージ 私はそれを修正しました... "echo!!Prev!"これは空白行を表示します。だから私はそれらを削除することを考える必要があります。 Powershellは実際に私の最初のアイデアでしたが、私は何かをインストールする権利がありません.... – rluks

+0

今すぐ動作するはずです。私は、最初の行が数字で始まる行かどうかのケースだったと思いますか? – Joey

関連する問題