0

我有这段代码对我的输入文件 abc.txt 进行排序并告诉我是否有任何重复,我需要修改这段代码以告诉我是否有任何记录超过了 reclen 指定的大小。

@echo off
rem 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

if exist %outputfile% del %outputfile%
echo Duplicates are as follows>>%outputfile%
set lastline=
for /f "delims==" %%L in (sorted.txt) do (
set thisline=%%L
if "!thisline!"=="!lastline!" echo !thisline!>>%outputfile%
    set lastline=%%L
)

pause

删除排序.txt

4

1 回答 1

0

要检查字符串是否超过长度限制,只需测试长度限制的子字符串是否与原始字符串不匹配。

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,并且不会与原始字符串匹配。

于 2012-12-17T18:00:42.033 回答