[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 如何提取两个字符之间的数值然后显示最小/最大数值

如何提取两个字符之间的数值然后显示最小/最大数值
比如有一a.txt内容为:
X-286.716 Y310.375 Z145.906
X-286.927 Y310.741 Z146.793
X-287.172 Y311.085 Z147.679
X-287.45 Y311.403 Z141.566
X-287.758 Y311.693 Z142.453
X-288.093 Y311.951 Z140.34
X-288.451 Y312.175 Z-149.226
X-288.83 Y312.362 Z-141.113
我要显示“z”与“."之间数值的最小植(-149),最大值(147)

如果我要同时搜索好几个txt文件该怎么弄

如果我要同时搜索好几个txt文件该怎么弄

TOP


@echo off&setlocal enabledelayedexpansion
set i=0&for /f "tokens=4 delims=Z." %%a in (a.txt b.txt c.txt)do set/ai+=1&if !i!==1 (set/amin=max=%%a)else if %%a lss !min! (set min=%%a)else if %%a gtr !max! set max=%%a
echo min: %min%&echo max: %max%&pause

[ 本帖最后由 rat 于 2008-12-4 20:45 编辑 ]

TOP

回复 1楼 的帖子

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set numMin=0
  4. set numMax=0
  5. for /f "tokens=4 delims=Z." %%a in (a.txt) do (
  6.   if %%a gtr !numMax! (
  7.     set numMax=%%a
  8.   ) else if %%a lss !numMin! (
  9.     set numMin=%%a
  10.   )
  11. )
  12. echo 最小值:%numMin%
  13. echo 最大值:%numMax%
复制代码

提示:该算法是错误的,具体原因见5楼。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 4楼 的帖子

貌似代码有错误。
if %%a lss !numMin! set numMin=%%a
若要比较的数字都是正数,就能看出出错结果了。
心绪平和,眼藏静谧。

TOP

  1. @Echo Off & Setlocal EnableDelayedExpansion
  2. set /a Max=0
  3. For /f "usebackq tokens=5 Delims=Z. " %%a In ("a.txt") Do (
  4.        If %%a Gtr !Max! (
  5.            set "Max=%%a"
  6.            ) Else (
  7.            If %%a lss !Num! set "Min=%%a"
  8.            set "Num=%%a"
  9.        )
  10. )
  11. Echo Max : %Max%
  12. Echo Min : %Min%
  13. Pause
复制代码
心绪平和,眼藏静谧。

TOP

为什么下面这段字符不行的

G43 H9 Z50.
G00 X-579.844 Y-0.09 Z50. M8
Z16.
G01 Z0.0 F900
X-578.112 Y-1.09 F3000
G03 X-581.09 Y1.888 I-1.888 J1.09
Y-1.888 I1.09 J-1.888
X-578.112 Y-1.09 I1.09 J1.888
G01 X-579.844 Y-0.09
G00 Z50.
X580.156 Y0.09
Z16.
G01 Z0.0 F900
X581.888 Y1.09 F3000
G03 X577.82 Y0.0 I-1.888 J-1.09
X581.09 Y-1.888 I2.18 J0.0
X581.888 Y1.09 I-1.09 J1.888
G01 X580.156 Y0.09
G00 Z50.

TOP

如何提取两个字符之间的数值然后显示最小/最大数值

如何提取两个字符之间的数值然后显示最小/最大数值
比如有一a.txt内容为:
G43 H9 Z50.
G00 X-579.844 Y-0.09 Z50. M8
Z-16.
G01 Z0.0 F900
X-578.112 Y-1.09 F3000
G03 X-581.09 Y1.888 I-1.888 J1.09
Y-1.888 I1.09 J-1.888
X-578.112 Y-1.09 I1.09 J1.888
G01 X-579.844 Y-0.09
G00 Z50.
X580.156 Y0.09
Z16.
G01 Z0.0 F900
X581.888 Y1.09 F3000
G03 X577.82 Y0.0 I-1.888 J-1.09
X581.09 Y-1.888 I2.18 J0.0
X581.888 Y1.09 I-1.09 J1.888
G01 X580.156 Y0.09
G00 Z50.
我要显示“z”与“."之间数值的最小植(-16),最大值(50)
之前我试了好几种,在一般的 情况下可以,在这种情况下都不行

TOP

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for /f "usebackq delims=" %%i in ("bj.ini") do (
  4.  set line=%%i
  5.  set line=!line:*Z=Z!
  6.  for /f "tokens=1* delims=Z." %%a in ("!line!") do (
  7.   if "%%a" lss "a" (
  8.    set num=%%a
  9.    if not defined Max set/a Max=num
  10.    if not defined Min set/a Min=num
  11.   )
  12.   if !Max! lss !num! (
  13.    set/a Max=num
  14.   )else if !Min! gtr !num! set/a Min=num
  15.  )
  16. )
  17. echo Max:!Max! Min:!Min!
  18. pause
复制代码

TOP

是不是可以想简单点

  1. @echo off&setlocal enabledelayedexpansion
  2. set /a min=0,max=0
  3. for /f "tokens=1,2 delims=Z" %%a in ('findstr "Z" a.txt') do (
  4.     if "%%b" equ "" (
  5.        set "str=%%a"
  6.        ) else (
  7.        set "str=%%b"
  8.      )
  9.      for /f "delims=." %%i in ("!str!") do (
  10.           if %%i leq !min! set "min=%%i"
  11.           if %%i geq !max! set "max=%%i"
  12.     )
  13. )
  14. echo 最小值为%min%,最大值为%max%。
  15. pause>nul
复制代码

[ 本帖最后由 batman 于 2008-12-6 20:23 编辑 ]
***共同提高***

TOP

回复 10楼 的帖子

回复batman兄,代码中有跟batcher同样的错误。
因为相对于整个文本来说,最小数是未知的,它有可能大于0。
心绪平和,眼藏静谧。

TOP

回11楼

开始没考虑全,现已修改。。。
***共同提高***

TOP

回复 10楼 的帖子

这样负值会消失。没搞清是什么原因,所以就写个复杂点的了。

TOP

考虑到最大数有可能不是正数,最小数有可能不是负数,想想还是用补位的方法吧:
  1. @Echo Off & Setlocal EnableDelayedExpansion
  2. For /F "delims=" %%a In ('Findstr /i "z" "a.txt"') do (
  3.        set "var=%%a" & set "var=!var:*z=!"
  4.        For /F "delims=." %%d In ("!var!") do (
  5.              set "var=......................................%%d"
  6.              set "#!var:~-20!=%%d"
  7. ))
  8. For /F "tokens=2 delims==" %%a in ('set #') do (
  9.       If Not Defined Flag Set "Flag=1" & Echo 最小值%%a
  10.       set "max=%%a"
  11. )
  12. Echo 最大值%max%
复制代码

[ 本帖最后由 pusofalse 于 2008-12-7 00:03 编辑 ]
心绪平和,眼藏静谧。

TOP

  1. //&cls&dir /a-d /b *.txt|cscript -nologo -e:jscript "%~f0"&pause&exit
  2. var fso = new ActiveXObject('Scripting.FileSystemObject');
  3. while(!WSH.StdIn.AtEndOfStream){
  4.     var line  = WSH.StdIn.ReadLine();
  5.     try{
  6.         var m = fso.OpenTextFile(line, 1).ReadAll().match(/\bZ-?\d+/g).sort(function(a,b){return a.substr(1)-b.substr(1)});
  7.         if(m)WSH.Echo(fso.GetFileName(line)+':'+m+' min:'+m[0].substr(1)+' max:'+m[m.length-1].substr(1));
  8.     }catch(e){}
  9. }
复制代码

TOP

返回列表