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

del sorted.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 に答える