0

の各行をループしfiles.txt、ファイルが かどうかを識別し、このcar情報を に保存するコードを作成しました。これは、 コマンドを使用し、およびのリストを検索することによって実行されます。本質的にコードが設計されている方法では、 の最初の行を取り、 で文字列を見つけることができるかどうかを確認します(そうであればに出力されます) で文字列を検索します(文字列が で見つかった場合は に出力されます)に)、文字列が car.txt または のいずれにも見つからない場合、テキストはに出力されます。boatneitherSendType.txtfindstrboat.txtcar.txtfiles.txtcar.txtcarSendType.txtboat.txtboat.txtboatSendType.txtboat.txtneitherSendType.txt

現在、コードは文字列行全体を検索しています。11111_2222-22_2010-09-09_10-24-20.zip各文字列は( 11111=ID、2222-22=model、2010-09-09=date、10-24-20=transaction ID)に似ています。

行全体を検索する現在の findstr 行を置き換えて、日付部分を除く文字列全体を検索したいと思います。入力されているファイルの例とともに、参照用に以下のコードを添付しました。前もって感謝します!

@echo off
FOR /F %%a in (files.txt) do (
findstr %%a car.txt
if errorlevel 1 (
findstr %%a boat.txt
    if errorlevel 1 (
    echo neither >>SendType.txt
) else (
    echo boat >>SendType.txt
)
) else (
    echo car >>SendType.txt
)
)

car.txt
11111_2222-22_2010-09-09_10-24-20.zip
11112_2222-11_2011-11-09_10-24-25.zip

boat.txt
11122_1111-22_2012-04-09_11-29-56.zip
11144_3333-11_2011-12-22_06-29-66.zip

files.txt
11122_1111-22_2000-01-01_11-29-56.zip
11144_3333-11_2000-01-01_06-29-66.zip
11155_1212-12_2000-01-01_11-19-69.zip
11111_2222-22_2000-01-01_10-24-20.zip
11112_2222-11_2000-01-01_10-24-25.zip
12345_2233-12_2000-01-01_07-27-44.zip

望ましい出力:

SendType.txt
boat
boat
neither
car
car
neither

UPDATE 10/15 3:00 PM dbenham のコードと解析手法を使用した現在のアプローチは次のとおりです。

@echo off    
>SendType.txt (  
for /f "tokens=1,2,3,4 delims=_" %%a in (filenames.txt) do (    
findstr /c:"%%a_%%b_%%d" sneakernet.txt >nul && (echo sneakernet) || (      
findstr /c:"%%a_%%b_%%d" devmed.txt >nul && (echo devmed) || echo tanto   
       ) 
    )
)
4

1 に答える 1

2

ID の形式が_日付の前に 2 つ固定されている場合、解決策は簡単です。単純に FOR /F を使用して値を解析します。

ERRORLEVEL をテストする代わりに&&andを使用するのが好きです。||また、FINDSTR の出力は必要ないため、nul にリダイレクトできます。文字列が行頭から一致することを確認する必要があります。最後に、リダイレクトする必要があるのは 1 回だけなので、追加する代わりに上書きできます。開始前に削除する必要がないため、繰り返しテストするのが簡単です。

@echo off
>SendType.txt (
  for /f "tokens=1,2 delims=_" %%a in (files.txt) do (
    findstr /bc:"%%a_%%b" car.txt >nul && (echo car) || (
      findstr /bc:"%%a_%%b" boat.txt >nul && (echo boat) || echo neither
    )
  )
)


ID の形式 (場合によっては長さ) が異なる可能性があるが、日付部分の形式 (長さ) が一定である場合は、部分文字列を使用できます。

@echo off
setlocal enableDelayedExpansion
>SendType.txt (
  for /f "delims=" %%a in (files.txt) do (
    set "ln=%%a"
    findstr /bc:"!ln:~0,-23!" car.txt >nul && (echo car) || (
      findstr /bc:"!ln:~0,-23!" boat.txt >nul && (echo boat) || echo neither
    )
  )
)


ID も日付形式も一定でない場合は、日付部分を取り除いて、boat.txt と car.txt の内容を変更します。その後、FINDSTR/Gオプションを使用できます。FINDSTR のバグのため、この/Iオプションが必要です。

car.txt
11111_2222-22
11112_2222-11

boat.txt
11122_1111-22
11144_3333-11

@echo off
setlocal enableDelayedExpansion
>SendType.txt (
  for /f "delims=" %%a in (files.txt) do (
    echo %%a|findstr /blig:car.txt >nul && (echo car) || (
      echo %%a|findstr /blig:boat.txt >nul && (echo boat) || echo neither
    )
  )
)

更新された回答

要件を理解したので、これで問題は解決するはずです。基本的に、元の回答で最初のコードのバリエーションを使用し、正規表現の使用に切り替えました。正規表現で[0-9]for eachを代入することにより、テストをより厳密にすることができます。.

@echo off
>SendType.txt (
  for /f "tokens=1,2,4 delims=_" %%a in (files.txt) do (
    findstr /brc:"%%a_%%b_....-..-.._%%c" car.txt >nul && (echo car) || (
      findstr /brc:"%%a_%%b_....-..-.._%%c" boat.txt >nul && (echo boat) || echo neither
    )
  )
)
于 2012-10-15T20:50:34.963 に答える