我想找到[
和]
之间的最大数字。到目前为止,我一无所获。
示例文本文件:
a.(1234)[00012]
bb.(4321)[00100]
ccc.(9876)[10101]
dd.(6789)[01010]
e.(5555)[00021]
期望的输出:
10101
答案 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%