标题: [问题求助] 【已解决】vbs如何实现文本行数据分段提取? [打印本页]
作者: 328612167 时间: 2015-7-13 16:43 标题: 【已解决】vbs如何实现文本行数据分段提取?
本帖最后由 328612167 于 2015-7-15 12:46 编辑
文本行数据分段提取的问题:
我想获得#328612167之后的所有行,并从中获得38和46所在行的“A+10-80”这个信息
注:文中只有一个38.00000 | 46.00000,只能从数值上比较,不能以文本比较
例如:DATA | A+10-80 | 2 | 4 | 38.00000 | 46.00000 | 3.00000 | 0.00000
判断 如果 第5个数值=38,第6个数值=46 , 则返回 A+10-80
用vbs我该怎么做- #-------------------------------------------------------------------------------
- DATA | A+10-80 | 1 | 1 | 0 | 9| 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-10-80
- DATA | A+10-55 | 1 | 1 | 0 | 9| 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-10-80
- DATA | A+4-110 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CS12-4-110
- DATA | A+4-55 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-4-55
- DATA | A+4-80 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-4-80
- DATA | A+6-55 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-6-55
- DATA | A+6-80 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-6-80
-
- #328612167-------------------------------------------------------------------------------
- DATA | A+10-80 | 2 | 1 | 16.00000 | 67.00000 | 3.00000 | 0.00000
- DATA | A+10-80 | 2 | 2 | 23.10000 | 9.50000 | 8.68000 | 0.00000
- DATA | A+10-80 | 2 | 3 | 26.00000 | 3.50000 | 0.00000 | 0.00000
- DATA | A+10-80 | 2 | 4 | 38.00000 | 46.00000 | 3.00000 | 0.00000
-
- DATA | A+10-80 | 2 | 7 | 150.00000 | 40.00000 | 0.00000 | 0.00000
- DATA | A63-CTH20-125 | 2 | 1 | 50.00000 | 125.00000 | 0.00000 | 0.00000
- DATA | A63-CTH20-125 | 2 | 2 | 63.00000 | 25.00000 | 0.00000 | 0.00000
- DATA | A63-CTH20-125 | 2 | 3 | 150.00000 | 40.00000 | 0.00000 | 0.00000
- DATA | A63-CTH25-105 | 2 | 4 | 200.00000 | 60.00000 | 0.00000 | 0.00000
- DATA | A63-CTH25-105 | 2 | 5 | 250.00000 | 50.00000 | 0.00000 | 0.00000
- DATA | AZ-6-120 | 2 | 1 | 13.00000 | 60.20000 | 9.30000 | 0.00000
- DATA | AZ-6-120 | 2 | 2 | 32.72000 | 31.50000 | 15.70000 | 0.00000
- DATA | AZ-6-120 | 2 | 3 | 50.43000 | 2.30000 | 48.00000 | 0.00000
- DATA | AZ-6-120 | 2 | 4 | 63.00000 | 26.00000 | 0.00000 | 0.00000
复制代码
作者: pcl_test 时间: 2015-7-13 17:00
本帖最后由 pcl_test 于 2015-7-13 17:03 编辑
提取规则是什么,38.00000 | 46.00000是固定的吗?而且只有一个吗?如果不是,说清楚提取规则
作者: 328612167 时间: 2015-7-13 17:16
回复 2# pcl_test
谢谢回复,问题我已更新
作者: pcl_test 时间: 2015-7-13 17:48
本帖最后由 pcl_test 于 2015-7-13 18:38 编辑
- Dim fso,File1',File2
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set File1= fso.OpenTextFile(".\测试.txt", 1)
- 'Set File2 = fso.CreateTextFile(".\结果.txt", 2 ,False)
- Do While File1.AtEndOfStream <> True
- str = File1.ReadLine
- If Left(str,10)="#328612167" Then
- def = 1
- End If
- arr = split(str,"|")
- If ubound(arr) > 6 Then
- a = Trim(arr(4))
- b = Trim(arr(5))
- a1 = split(a,".")
- b1 = split(b,".")
- If def=1 and a1(0)="38"and b1(0)="46" and IsNumeric(a) and IsNumeric(b) Then
- msgbox arr(1)
- 'File2.WriteLine arr(1)
- Wscript.Quit
- End If
- End If
- loop
复制代码
作者: 328612167 时间: 2015-7-13 18:18
回复 4# pcl_test
你好,你这是文本比较吧?
我说的这“文本比较”可能不专业,希望你能理解
如果是2位小数呢,如 38.45和46.195呢,就不能以.分割了,所以我想以数值比较
作者: pcl_test 时间: 2015-7-13 18:38
回复 5# 328612167
已修改
作者: 328612167 时间: 2015-7-14 19:06
回复 6# pcl_test
谢谢回复,多谢帮忙,现在搞定了
作者: 328612167 时间: 2015-7-14 19:27
回复 6# pcl_test
你好,因为还有一些问题没解决,所有没改为“已解决”
再扩展一下:
我想搜索 第二个变量(如:A+10-80),然后要将全文中所有的 A+10-80 都替换为 A+10-80-A001
接着搜索 下一行的 (如:A+10-55),然后将全文中所有的 A+10-55 都替换为A+10-55-A002(递增+1)
.
.
.
直到结尾
作者: pcl_test 时间: 2015-7-14 19:33
回复 8# 328612167
从哪行开始,开头还是#328612167之后
作者: 328612167 时间: 2015-7-14 19:37
回复 9# pcl_test
搜索是从 #328612167 之后,替换是全文
作者: pcl_test 时间: 2015-7-14 20:29
本帖最后由 pcl_test 于 2015-7-14 20:34 编辑
回复 10# 328612167
本版规则
1、求助时,务必在顶楼一次性把问题交代清楚,建议给出完整有针对性的样本,样本过大可发网盘分享链接。勿发无意义的标题
2、使用 code 标记把代码部分括起来(选中代码后,单击回复框的 <> 按钮),以便复制。问题解决后,请编辑顶楼帖子在标题前面注明[已解决]- Dim fso,File1,File2,str,txt,arr,Dict
- Set Dict = CreateObject("Scripting.Dictionary")
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set File1 = fso.OpenTextFile(".\测试.txt", 1)
- Set File2 = fso.CreateTextFile(".\结果.txt", 2 ,False)
- n = 1000
- Do While File1.AtEndOfStream <> True
- str = File1.ReadLine
- txt = txt&str&vbCrLf
- If Left(str,10)="#328612167" Then def = 1
- arr = split(str,"|")
- If ubound(arr) > 6 Then
- If def=1 and Dict.Exists(arr(1)) <> True Then
- n=n+1
- Dict.Add arr(1), rtrim(arr(1))&"-A"&right(n,3)&" "
- End If
- End If
- Loop
-
- Dim tmp,objKeys,objItems
- objKeys = Dict.Keys
- objItems = Dict.Items
- For i = 0 To Dict.Count -1
- tmp = replace(txt,objKeys(i),objItems(i))
- txt = tmp
- Next
- File2.Write txt
- File1.Close
- File2.Close
- Dict.RemoveAll
- Set Dict = Nothing
- Msgbox "完成"
复制代码
作者: 328612167 时间: 2015-7-15 12:48
回复 11# pcl_test
本版规则
1、求助时,务必在顶楼一次性把问题交代清楚,建议给出完整有针对性的样本,样本过大可发网盘分享链接。勿发无意义的标题
2、使用 code 标记把代码部分括起来(选中代码后,单击回复框的 <> 按钮),以便复制。问题解决后,请编辑顶楼帖子在标题前面注明[已解决]
恩,以后会注意的,多谢大神
作者: zhangop9 时间: 2020-11-26 08:50
留个记号,用的上
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |