Board logo

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

作者: lvrendos    时间: 2008-12-4 18:44     标题: 如何提取两个字符之间的数值然后显示最小/最大数值

如何提取两个字符之间的数值然后显示最小/最大数值
比如有一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)
作者: lvrendos    时间: 2008-12-4 18:45     标题: 如果我要同时搜索好几个txt文件该怎么弄

如果我要同时搜索好几个txt文件该怎么弄
作者: rat    时间: 2008-12-4 20:37


@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 编辑 ]
作者: Batcher    时间: 2008-12-4 20:40     标题: 回复 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楼。
作者: pusofalse    时间: 2008-12-4 22:04     标题: 回复 4楼 的帖子

貌似代码有错误。
if %%a lss !numMin! set numMin=%%a
若要比较的数字都是正数,就能看出出错结果了。
作者: pusofalse    时间: 2008-12-4 22:23

  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
复制代码

作者: lvrendos    时间: 2008-12-6 18:27     标题: 为什么下面这段字符不行的

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.
作者: lvrendos    时间: 2008-12-6 18:37     标题: 如何提取两个字符之间的数值然后显示最小/最大数值

如何提取两个字符之间的数值然后显示最小/最大数值
比如有一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)
之前我试了好几种,在一般的 情况下可以,在这种情况下都不行
作者: wxcute    时间: 2008-12-6 19:32

  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
复制代码

作者: batman    时间: 2008-12-6 20:12     标题: 是不是可以想简单点

  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 编辑 ]
作者: pusofalse    时间: 2008-12-6 20:20     标题: 回复 10楼 的帖子

回复batman兄,代码中有跟batcher同样的错误。
因为相对于整个文本来说,最小数是未知的,它有可能大于0。
作者: batman    时间: 2008-12-6 20:24     标题: 回11楼

开始没考虑全,现已修改。。。
作者: wxcute    时间: 2008-12-6 20:26     标题: 回复 10楼 的帖子

这样负值会消失。没搞清是什么原因,所以就写个复杂点的了。
作者: pusofalse    时间: 2008-12-6 23:33

考虑到最大数有可能不是正数,最小数有可能不是负数,想想还是用补位的方法吧:
  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 编辑 ]
作者: pcl_test    时间: 2016-9-24 15:03

  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. }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2