@ECHO OFF
SETLOCAL enabledelayedexpansion
:: Temporary filename
:tloop
SET "temppfx=%temp%\%random%"
IF EXIST "%temppfx%*" GOTO tloop
:: Hold that tempfile name...
ECHO.>"%temppfx%_"
:: a long string of spaces note the end-of-string quote -----here--v
SET "spaces= "
SET /a count=0
(
FOR /f "tokens=1,3 delims=|" %%a IN (fscif.txt) DO (
SET /a count+=1
SET "field1=%%a%spaces%"
SET "field3=%%b%spaces%"
SET "fieldc=%spaces%!count!"
ECHO(!field1:~0,10!!field3:~0,12!^|!fieldc:~-8!^|!count!^|%%a^|%%b
)
)>"%temppfx%1"
:: Now report
SET "key=x"
SET /a count=0
(
FOR /f "tokens=1,3* delims=|" %%a IN ('sort "%temppfx%1" ') DO (
IF "!key!"=="%%a" (
SET "line=!line! %%b"
SET /a count+=1
) ELSE (IF !count! neq 0 CALL :output
SET key=%%a
SET line=%%b
SET "data=%%c"
SET /a count=1
)
)
CALL :output
)>report.txt
del "%temppfx%*"
GOTO :eof
:output
ECHO(!data!;%count% times;line nos %line: = ^& %
GOTO :eof
前に説明したように、何百万ものレコードがあると、環境スペースが不足する可能性があります。上に投稿したように、行番号のレポートが膨大になる可能性があるため、まだ使い果たしてしまう可能性があると思います-わかりません-あなたは実際のデータに精通しています.
基本的に、最初に行うことは、一時ファイルを作成することです。
入力ファイルで必要なトークンから始めます - 私は 1 と 3 に従いましたが、間違いなくもっとあるかもしれません - バウンドするボールに従ってください...
選択されたフィールドはパディングされます - テキスト フィールドの場合は右側、spaces
変数を使用するカウント フィールドの場合は左側です。
次に、tempfile 出力が生成されます。最初のフィールドには 10 の最大長をランダムに選択し、2 番目のフィールドには 12 を選択しました。これら 2 つを組み合わせてkey
フィールドを作成します。先頭が埋められたカウント フィールドは 2 番目の列として出力されるため、SORT
ing の後、データはキー、次に行番号でグループ化されて表示されます。次に、関心のある残りの列が再現されます。
次に、データは次のfor/f
ループへの入力としてソートされます。トークン 1 (キー)、3 (生の行番号)、および「残り」 (パディングなしのキー) のみが重要です。
次に、一致するキーを数え、行番号を累積しline
、キーが変更されたときに報告するだけです。最後のデータ項目を報告するには、最後の出力が 1 つ必要です。これで完了です。