找到两个字符之间的最大数字

时间:2014-12-25 17:24:17

标签: batch-file cmd

我想找到[]之间的最大数字。到目前为止,我一无所获。

示例文本文件:

a.(1234)[00012]
bb.(4321)[00100]
ccc.(9876)[10101]
dd.(6789)[01010]
e.(5555)[00021]

期望的输出:

10101

3 个答案:

答案 0 :(得分:1)

这不是很难。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "MaxNumber=0"
for /F "tokens=2 delims=[]" %%V in (Example.txt) do (
    if not "%%V"=="" (
        for /F "tokens=* delims=0" %%N in ("%%V") do if %%N GTR !MaxNumber! set "MaxNumber=%%N"
    )
)
echo Biggest number is: %MaxNumber%
endlocal

有关使用过的命令的详细信息,请在命令提示符窗口中执行

  • for /?help for
  • if /?help if
  • set /?help set
  • setlocal /?help setlocal

删除前导零的行取自Remove leading zeros in batch file

修改

我移动 for 循环以将尾随零删除到另一个循环中以避免将数字解释为八进制数。感谢dbenham提示。

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL
SET /a maxnum=0
SET "maxraw="
FOR /f "tokens=2delims=[]" %%a IN (q27649334.txt) DO CALL :max %%a
ECHO maximum is "%maxraw%" with value %maxnum%

GOTO :EOF

:max
SET candidate=%1
:maxl
IF NOT "%candidate%"=="0" IF "%candidate:~0,1%"=="0" SET "candidate=%candidate:~1%"&GOTO maxl
IF %candidate% lss %maxnum% GOTO :EOF 
SET /a maxnum=candidate
:setmax
SET "maxraw=%1"
GOTO :eof

我使用了一个名为q27649334.txt的文件,其中包含我的测试数据。

这假设[...]中的字符串始终是纯数字和0..999999999

如果字符串可以更长,则需要进行不同的比较。

不清楚你是想要数值还是数值最高的字符串,所以你得到两者。如果maxraw未定义,则maxnum将为0

答案 2 :(得分:1)

假设您的号码始终在第一组方括号内,并且假设数字永远不会超过2147483647,那么您可以使用:

@echo off
setlocal enableDelayedExpansion
set "max=0"
for /f "tokens=2 delims=[]" %%A in (example.txt) do (
  for /f "tokens=* delims=0" %%B in ("%%A") do if %%B gtr !max! set "max=%%B"
)
echo max=%max%

第一个循环从括号中提取数字。第二个循环剥离任何前导零。 OP不仅要求这样做,而且对IF语句正确解释数字至关重要。 IF会将带有前导零的数字视为八进制表示法,这会产生错误的结果。将完全跳过值为0的行。但即使所有值都为0,也没关系,因为max初始化为0。

如果任何值超过2147483647,或者由于输入文件非常大而上述速度很慢,那么我会使用我的JSORT.BAT utility来正确排序最多20位的非负整数,快速返回具有最高值的单行。 JSORT.BAT是混合JScript /批处理脚本,可以在XP之后的任何Windows机器上运行。

这只有在数字永远不会消极的情况下才有效。如果输入文件很大,它应该快得多。

@echo off
setlocal
set "max=0"
for /f "tokens=2 delims=[]" %%A in (
  'type example.txt ^| jsort /d "[" /t 2 /n /r /c 1'
) do for /f "tokens=* delims=0" %%B in ("%%A") do set "max=%%B"
echo max=%max%