要检查字符串是否超过长度限制,只需测试长度限制的子字符串是否与原始字符串不匹配。
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
,并且不会与原始字符串匹配。