返回列表 发帖

[问题求助] 【已解决】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.012COPY
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

第三方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]);
}COPY

TOP

回复 16# raozhao2008


    下载安装python3
代码存为xx.py

TOP

回复 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
""COPY

TOP

回复 15# 依山居


   多谢您回复,但我不会用python,不知这代码保存为什么格式,是否要编辑

TOP

#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:
    passCOPY
处理几十M的文本都说觉得大了。生成了一千万行→_→"大数据"测试,文本也不过400M而已。反正几百M的文件都小于可用内存。一次读入完全不成问题。

TOP

回复 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=" & MinCOPY

TOP

回复 10# WHY


   找到一个JS的,速度非常快,可不知用这思路vbs能否实现

TOP

找到一个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);COPY

TOP

回复 3# pcl_test

运行到此句时报错MsgBox "最大"&objExcel.Max(arr)&vbCrLf&"最小"&objExcel.Min(arr)
   类型不匹配‘objExcel.Max’

TOP

本帖最后由 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=" & MinCOPY

TOP

回复 8# 依山居

匹配的是Z30,30.0是因为float(r)所得
1

评分人数

TOP

回复 3# pcl_test


    请问版主,为什么正则我写成Z(-?\d*\.?\d+)
发现也能匹配到 30. 呢?小数点后面并没有数字啊?

TOP

#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
"""COPY

TOP

如@pcl_test 说的用 Excel 排序或编辑器升降排序这样可能行快些。

TOP

返回列表