文字列が長さ制限を超えているかどうかを確認するには、長さ制限の部分文字列が元の文字列と一致しないかどうかを単純にテストします。
if "!thisline:~0,%reclen%!" neq "!thisline!" echo Line length exceeded
ここに完全な実用的なソリューションがあります
@echo off
setlocal enableDelayedExpansion
set "inputfile=abc.txt"
set "outputfile=text2.txt"
set reclen=100
echo File to be processed
echo(
type "%inputfile%"
echo(
if exist sorted.txt del sorted.txt
sort %inputfile% /O sorted.txt
set "lastline="
> "%outputfile%" (
for /f "delims==" %%L in (sorted.txt) do (
set "thisline=%%L"
if "!thisline!" equ "!lastline!" echo(DUPLICATE: !thisline!
if "!thisline:~0,%reclen%!" neq "!thisline!" echo( TOO LONG: !thisline!
set "lastline=%%L"
)
)
del sorted.txt
type "%outputfile%"
pause
データに が含まれている場合、上記は失敗する可能性があることに注意してください!
。これは、ループ内で遅延展開のオンとオフを切り替えることで解決できます。
@echo off
setlocal disableDelayedExpansion
set "inputfile=abc.txt"
set "outputfile=text2.txt"
set reclen=100
echo File to be processed
echo(
type "%inputfile%"
echo(
if exist sorted.txt del sorted.txt
sort %inputfile% /O sorted.txt
set "lastline="
> "%outputfile%" (
for /f "delims==" %%L in (sorted.txt) do (
set "thisline=%%L"
setlocal enableDelayedExpansion
if "!thisline!" equ "!lastline!" echo(DUPLICATE: !thisline!
if "!thisline:~0,%reclen%!" neq "!thisline!" echo( TOO LONG: !thisline!
endlocal
set "lastline=%%L"
)
)
del sorted.txt
type "%outputfile%"
pause
最後に、OP のコメントで要求されているように、reclen で指定された長さに一致しない行を識別するバージョンを次に示します。以前のバージョンから 2 つの小さな変更が必要なだけです。
@echo off
setlocal disableDelayedExpansion
set "inputfile=abc.txt"
set "outputfile=text2.txt"
set reclen=100
echo File to be processed
echo(
type "%inputfile%"
echo(
if exist sorted.txt del sorted.txt
sort %inputfile% /O sorted.txt
set "lastline="
> "%outputfile%" (
for /f "delims==" %%L in (sorted.txt) do (
set "thisline=%%L"
set "testline=%%Lx"
setlocal enableDelayedExpansion
if "!thisline!" equ "!lastline!" echo( DUPLICATE: !thisline!
if "!testline:~0,%reclen%!" neq "!thisline!" echo(BAD LENGTH: !thisline!
endlocal
set "lastline=%%L"
)
)
del sorted.txt
type "%outputfile%"
pause
行が reclen よりも長い場合、部分文字列は値を切り捨て、元の値と一致しません。
行の長さが reclen と正確に等しい場合、部分文字列は のみをトリミングしx
、元の行と一致します。
行が reclen より短い場合、部分文字列は を削除せずx
、元の行と一致しません。