-1

私はバッチプログラミングの経験があまりありません。さまざまなコードをまとめてみましたが、私が望んでいるようには機能しません。

これが問題です。ログ ファイルはディレクトリに作成されます。いくつかは複数のエントリで、いくつかは単一のエントリです。それらはすべて特定のパターンに従います。F.ex。

    START STRING 1234
    NAME1 ADRESS1 ETC
    NAME2 ADRESS2 ETC
    NAME3 ADRESS3 ETC

1 つのファイルに複数の名前エントリがある場合もあれば、1 つのエントリだけの場合もあります。すべてのファイルには開始文字列があります。私がしなければならないことは、これらのログ ファイルを解析し、別のディレクトリに再作成することです。ファイル内の名前ごとに 1 つのファイルを、それぞれ 1 つの名前付きファイルの形式で作成します。上記の例を使用すると、次のような 3 つのファイルが作成されます。

    START STRING
    NAME ADRESS ETC

これがコードソファーです。それはある程度機能します..ディレクトリに一度に複数のログファイルがある場合を除いて、2つのSTART STRINGのみを含むいくつかのエントリが作成されるため、これを回避する必要があります。つまり、すべてのログ ファイルを 1 つの大きなテキスト ファイルとして扱うのではなく、各ログ ファイルを個別に処理する必要があります。

    @Echo off
    @setlocal enableextensions enabledelayedexpansion


    :::First find out how many lines a file has.
    Set _File=*.log
    Set /a _Lines=0
    For /f %%j in ('Type %_File%^|Find "" /v /c') Do Set /a _Lines=%%j
    set /a "linecount= _Lines"


    :::Grab the first line always and then create a new file depending on how many         lines the file contained
    :LOOP
    if %linecount% GEQ 2 ( 
        set /a "linecount = linecount - 1"
        set lines=1 %linecount%
        set curr=1
            for /f "delims=" %%a in ('type *.log') do (
                    for %%b in (!lines!) do (
                    if !curr!==%%b echo %%a >> c:\temp\logs\%linecount%.log
                    )
                set /a "curr = curr + 1"
            )
    )
    if %linecount% GEQ 2 (GOTO LOOP)
    endlocal

これを行うにはもっと賢い方法があると確信していますが、これは私が得た限りです。最初の行を削除せずに、またはできれば二重の開始文字列をすべて一緒にすることを避けて、開始文字列を単純に一致させて何らかの方法で削除できるかどうか疑問に思います。

4

2 に答える 2