标题: [问题求助] 【已解决】vbs怎么求txt文件中所有指定字符后面数字的最小值和最大值 [打印本页]
作者: raozhao2008 时间: 2015-11-7 17:27 标题: 【已解决】vbs怎么求txt文件中所有指定字符后面数字的最小值和最大值
本帖最后由 pcl_test 于 2016-8-16 20:30 编辑
vbs怎么求txt文件中所有Z后面数字的最小值和最大值?说明:Z之前有一空格,之后是数字(包括正数负数),
另外此文件大小有10M以上,下列代码只是样例。以下是123.txt文件内容- G00 X103.5 Y14.218 S3500 M03
- G43 Z19.429 H02
- Z-14.477
- G01 Z-14.77 F1500.
- X102.479 Z-15.012
- X86.047 Y30.86 Z-15.312
- G03 X87.002 Y27.983 Z-16.012 I-19.052 J-.001
- G01 Z-50.013
- Z30.
- G01 Z-14.977 F1500.
- X102.479 Z-15.012
- X86.047 Y30.86 Z-15.012
复制代码
作者: 依山居 时间: 2015-11-7 17:43
并没有说明输出格式。
我试试 python list排序。
作者: pcl_test 时间: 2015-11-7 17:55
本帖最后由 pcl_test 于 2015-11-8 09:59 编辑
- Dim arr()
- i = 0
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set f = fso.OpenTextFile("测试.txt",1)
- Do While f.AtEndOfStream <> True
- str = f.ReadLine
- GetZ(str)
- Loop
- f.Close
- '调用Excel函数
- Set objExcel= CreateObject("Excel.Application")
- MsgBox "最大"&objExcel.Max(arr)&vbCrLf&"最小"&objExcel.Min(arr)
-
- Function GetZ(str)
- Set regEx = New RegExp
- regEx.Pattern = "\bZ(-?\d+\.?\d*)"
- regEx.Global = True
- If regEx.Test(str) Then
- Set Matches = regEx.Execute(str)
- For Each Match in Matches
- ReDim Preserve arr(i)
- arr(i) = CDbl(Match.SubMatches(0))
- i = i+1
- Next
- End If
- End Function
复制代码
作者: 依山居 时间: 2015-11-7 19:07
- #求txt文件中所有Z后面数字的最小值和最大值
- #依山居 19:04 2015/11/7
- #题目来源: http://www.bathome.net/thread-38027-1-1.html
-
- zl=[]
- with open("a.txt") as f:
- for l in f:
- txtline=l.rsplit()
- for ll in txtline:
- #print(ll)
- if ll[0]=="Z":
- x=float(ll[1:])
- zl.append(x)
-
- #方法一:使用python内建的max min函数
- print("大: ",max(zl))
- print("小: ",min(zl))
- #方法二: 使用sorted排序后取首位和末尾元素。
- zl=sorted(zl)
- print("小: ",zl[0])
- print("大: ",zl[-1])
-
- #总结是不管是max 还是sort 比较的对象都应该统一是数字。
- #所以处理前需要先丢掉字母Z并转成浮点数。
-
- """
- 输出:
- 大: 30.0
- 小: -50.013
- 小: -50.013
- 大: 30.0
- """
复制代码
作者: 依山居 时间: 2015-11-7 19:17
楼主也是08年的帐号了。学门语言不过几周能入门了。
作者: winbat 时间: 2015-11-7 19:28
如@pcl_test 说的用 Excel 排序或编辑器升降排序这样可能行快些。
作者: 依山居 时间: 2015-11-8 03:30
- #python正则求txt文件中所有Z后面数字的最小值和最大值
- #依山居 2:23 2015/11/8
- #题目来源: http://www.bathome.net/thread-38027-1-1.html
- #这个版本改用正则表达式处理文本.
- import re
- def ftxt(txt="a.txt"):
- #global zl
- zl=[]
- reg=re.compile("Z(-?\d*\.?\d*)")
- with open(txt) as f:
- for line in f:
- regresult=re.findall(reg,line)
- if regresult:
- for r in regresult:
- zl.append(float(r))
- print(len(zl))
- return zl
-
- zl=ftxt()
- print(zl)
- #方法一:使用python内建的max min函数
- print("大: ",max(zl))
- print("小: ",min(zl))
- #方法二: 使用sorted排序后取首位和末尾元素。
- zl=sorted(zl)
- print("小: ",zl[0])
- print("大: ",zl[-1])
- #总结是不管是max 还是sort 比较的对象都应该统一是数字。
- #所以处理前需要先丢掉字母Z并转成浮点数。
- """
- 输出:
- 11
- [19.429, -14.477, -14.77, -15.012, -15.312, -16.012,
- -50.013, 30.0, -14.977, -15.012, -15.012]
- 大: 30.0
- 小: -50.013
- 小: -50.013
- 大: 30.0
- """
复制代码
作者: 依山居 时间: 2015-11-8 03:33
回复 3# pcl_test
请问版主,为什么正则我写成Z(-?\d*\.?\d+)
发现也能匹配到 30. 呢?小数点后面并没有数字啊?
作者: pcl_test 时间: 2015-11-8 08:59
回复 8# 依山居
匹配的是Z30,30.0是因为float(r)所得
作者: WHY 时间: 2015-11-8 16:16
本帖最后由 WHY 于 2015-11-8 17:26 编辑
假设Z轴数据范围:-9999~9999- Dim fso, objFile, objReg, Max, Min, str, n
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set objFile = fso.OpenTextFile("a.txt")
- Set objReg = New RegExp
- objReg.Pattern = "\bZ(-?\d*\.?\d+)\b"
-
- Max = -9999 : Min = 9999
- While Not objFile.AtEndOfStream
- str = objFile.ReadLine
- If objReg.Test(str) Then
- n = objReg.Execute(str)(0).SubMatches(0) * 1
- If n > Max Then Max = n
- If n < Min Then Min = n
- End If
- Wend
-
- MsgBox "Max=" & Max & " Min=" & Min
复制代码
作者: raozhao2008 时间: 2015-11-9 13:43
回复 3# pcl_test
运行到此句时报错MsgBox "最大"&objExcel.Max(arr)&vbCrLf&"最小"&objExcel.Min(arr)
类型不匹配‘objExcel.Max’
作者: raozhao2008 时间: 2015-11-9 13:58
找到一个JS的,速度非常快,可不知用这思路vbs能否实现- path = "123.txt";
- fso = new ActiveXObject('Scripting.FileSystemObject');
- Znums = fso.OpenTextfile(path).ReadAll().match(/\bZ[-.\d]+\b/gi);
- Znums = Znums.join(',').replace(/Z/gi,'').split(',');
- Zmin = parseFloat(Znums[0]);
- for (i=0;i<Znums.length;i++) {
- Znum = parseFloat(Znums[i]);
- if(Znum<Zmin) Zmin=Znum;
- }
- Zmax = parseFloat(Znums[0]);
- for (i=0;i<Znums.length;i++) {
- Znum = parseFloat(Znums[i]);
- if(Znum>Zmax) Zmax=Znum;
- }
- WScript.Echo(Zmax + "/" + Zmin);
复制代码
作者: raozhao2008 时间: 2015-11-9 13:59
回复 10# WHY
找到一个JS的,速度非常快,可不知用这思路vbs能否实现
作者: WHY 时间: 2015-11-9 14:41
回复 13# raozhao2008
你认为10#思路和你的JS有区别吗?
如果txt文件小,当然可以用ReadAll 速度也会快些- Dim fso, objReg, Max, Min, str, n
- Set fso = CreateObject("Scripting.FileSystemObject")
- str = fso.OpenTextFile("123.txt").ReadAll
-
- Set objReg = New RegExp
- objReg.Pattern = "\bZ(-?\d*\.?\d+)\b"
- objReg.Global = True
-
- For Each Match In objReg.Execute(str)
- n = Match.SubMatches(0) * 1
- If IsEmpty(Max) Or n > Max Then Max = n
- If IsEmpty(Min) Or n < Min Then Min = n
- Next
-
- MsgBox "Max=" & Max & " Min=" & Min
复制代码
作者: 依山居 时间: 2015-11-11 10:35
- #python生成测试数据
- #依山居 10:07 2015/11/11
-
- import random
- import string
- import time
- start=time.time()
- az=string.ascii_uppercase
-
- out=open("b.txt","a+")
- for r in range(10000000):
- ts=""
- for s in range(1,random.randint(1,10)):
- #razint=random.randint(0,25)
- #raz=az[razint] #-_- random.choice()方法,简单也是等效的。
- raz=random.choice(az)
- rf=random.uniform(-99,999)
- rf=round(rf,random.randint(0,4))
- ts+=raz+str(rf)+" "
-
- out.write(ts+"\n")
-
- out.close()
- end=time.time()
- pt=end-start
-
- print("程序运行时间:",pt)
- try:
- input("按回车退出")
- except SyntaxError:
- pass
复制代码
处理几十M的文本都说觉得大了。生成了一千万行→_→"大数据"测试,文本也不过400M而已。反正几百M的文件都小于可用内存。一次读入完全不成问题。
作者: raozhao2008 时间: 2015-11-11 11:01
回复 15# 依山居
多谢您回复,但我不会用python,不知这代码保存为什么格式,是否要编辑
作者: 依山居 时间: 2015-11-11 11:29
回复 9# pcl_test
我也顺便给版主反馈一下。不需要逐行处理。- #python正则求txt文件中所有Z后面数字的最小值和最大值3
- #依山居 10:57 2015/11/11
- #题目来源: http://www.bathome.net/thread-38027-1-1.html
-
- #这个版本使用read()直接读入整个文件内容然后正则匹配.
- #经过测试比逐行处理,速度快了3-5倍
- #总结:一次性读入正则匹配整个文件内容,处理速度快了3-5倍。
- #要不是自己起心生成数据来测试,就被带到沟里了。
-
- import time
- start=time.time()
-
- import re
- def ftxt(txt="b.txt"):
- #global zl
- zl=[]
- reg=re.compile("Z(-?\d*\.?\d*)")
- with open(txt) as f:
- c=f.read()
- regresult=re.findall(reg,c)
- if regresult:
- for r in regresult:
- zl.append(float(r))
-
-
- return zl
-
- zl=ftxt()
- print("list长度: ",len(zl))
- #方法一:使用python内建的max min函数
- print("大: ",max(zl))
- print("小: ",min(zl))
- #方法二: 使用sorted排序后取首位和末尾元素。
- #还可以用zl.sort(reverse=True) zl.reverse() 排序
- zl=sorted(zl)
- print("小: ",zl[0])
- print("大: ",zl[-1])
- #总结是不管是max 还是sort 比较的对象都应该统一是数字。
- #所以处理前需要先丢掉字母Z并转成浮点数。
-
- end=time.time()
- pt=end-start
- print("程序运行时间:",pt)
- try:
- input("按回车退出")
- except SyntaxError:
- pass
-
- """
- 输出:
- list长度: 1921678
- 大: 999.0
- 小: -99.0
- 小: -99.0
- 大: 999.0
- 程序运行时间: 7.053403377532959
- ""
复制代码
作者: 依山居 时间: 2015-11-11 11:30
回复 16# raozhao2008
下载安装python3
代码存为xx.py
作者: pcl_test 时间: 2016-8-16 20:53
第三方http://www.bathome.net/s/tool/index.html?key=gawk- #*&cls&@gawk -f "%~f0" "1.txt">con&pause&exit
- {
- for(i=1;i<=NF;i++){if($i~/Z-?[0-9]+\.?[0-9]*/)a[substr($i,2)]=substr($i,2)*1}
- }
- END{
- len=asort(a,b); printf("最大%.3f\n最小%.3f\n",b[len],b[1]);
- }
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |