Board logo

标题: [问题求助] 【已解决】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我该怎么做
  1. #-------------------------------------------------------------------------------
  2. DATA | A+10-80 | 1 | 1 | 0 | 9| 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-10-80
  3. DATA | A+10-55 | 1 | 1 | 0 | 9| 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-10-80
  4. DATA | A+4-110 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CS12-4-110
  5. DATA | A+4-55 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-4-55
  6. DATA | A+4-80 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-4-80
  7. DATA | A+6-55 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-6-55
  8. DATA | A+6-80 | 1 | 1 | 0 | 9 | 0.00000 | 0.00000 | 0.00000 | A63-SLK12-75+CR12-6-80
  9. #328612167-------------------------------------------------------------------------------
  10. DATA | A+10-80 | 2 | 1 |  16.00000 |  67.00000 |   3.00000 |   0.00000
  11. DATA | A+10-80 | 2 | 2 |  23.10000 |   9.50000 |   8.68000 |   0.00000
  12. DATA | A+10-80 | 2 | 3 |  26.00000 |   3.50000 |   0.00000 |   0.00000
  13. DATA | A+10-80 | 2 | 4 |  38.00000 |  46.00000 |   3.00000 |   0.00000
  14. DATA | A+10-80 | 2 | 7 |  150.00000 |  40.00000 |   0.00000 |   0.00000
  15. DATA | A63-CTH20-125 | 2 | 1 |  50.00000 | 125.00000 |   0.00000 |   0.00000
  16. DATA | A63-CTH20-125 | 2 | 2 |  63.00000 |  25.00000 |   0.00000 |   0.00000
  17. DATA | A63-CTH20-125 | 2 | 3 |  150.00000 |  40.00000 |   0.00000 |   0.00000
  18. DATA | A63-CTH25-105 | 2 | 4 |  200.00000 |  60.00000 |   0.00000 |   0.00000
  19. DATA | A63-CTH25-105 | 2 | 5 |  250.00000 |  50.00000 |   0.00000 |   0.00000
  20. DATA | AZ-6-120 | 2 | 1 |  13.00000 |  60.20000 |   9.30000 |   0.00000
  21. DATA | AZ-6-120 | 2 | 2 |  32.72000 |  31.50000 |  15.70000 |   0.00000
  22. DATA | AZ-6-120 | 2 | 3 |  50.43000 |   2.30000 |  48.00000 |   0.00000
  23. 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 编辑
  1. Dim fso,File1',File2
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set File1= fso.OpenTextFile(".\测试.txt", 1)
  4. 'Set File2 = fso.CreateTextFile(".\结果.txt", 2 ,False)  
  5. Do While File1.AtEndOfStream <> True
  6.     str = File1.ReadLine
  7.     If Left(str,10)="#328612167" Then
  8.     def = 1
  9.     End If
  10.     arr = split(str,"|")
  11.     If ubound(arr) > 6 Then
  12.     a = Trim(arr(4))
  13.     b = Trim(arr(5))
  14.     a1 = split(a,".")
  15.     b1 = split(b,".")
  16.     If def=1 and a1(0)="38"and b1(0)="46" and IsNumeric(a) and IsNumeric(b) Then
  17.     msgbox arr(1)
  18.     'File2.WriteLine arr(1)
  19.     Wscript.Quit
  20.     End If
  21.     End If
  22. 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 标记把代码部分括起来(选中代码后,单击回复框的 <> 按钮),以便复制。问题解决后,请编辑顶楼帖子在标题前面注明[已解决]
  1. Dim fso,File1,File2,str,txt,arr,Dict
  2. Set Dict = CreateObject("Scripting.Dictionary")
  3. Set fso = CreateObject("Scripting.FileSystemObject")
  4. Set File1 = fso.OpenTextFile(".\测试.txt", 1)
  5. Set File2 = fso.CreateTextFile(".\结果.txt", 2 ,False)
  6. n = 1000
  7. Do While File1.AtEndOfStream <> True
  8.     str = File1.ReadLine
  9.     txt = txt&str&vbCrLf
  10.     If Left(str,10)="#328612167" Then def = 1
  11.     arr = split(str,"|")
  12.     If ubound(arr) > 6 Then
  13.         If def=1 and Dict.Exists(arr(1)) <> True Then
  14.               n=n+1
  15.               Dict.Add arr(1), rtrim(arr(1))&"-A"&right(n,3)&" "
  16.         End If
  17.     End If
  18. Loop
  19. Dim tmp,objKeys,objItems
  20. objKeys = Dict.Keys
  21. objItems = Dict.Items
  22. For i = 0 To Dict.Count -1
  23.     tmp = replace(txt,objKeys(i),objItems(i))
  24.     txt = tmp
  25. Next
  26. File2.Write txt
  27. File1.Close
  28. File2.Close
  29. Dict.RemoveAll
  30. Set Dict = Nothing
  31. Msgbox "完成"
复制代码

作者: 328612167    时间: 2015-7-15 12:48

回复 11# pcl_test

本版规则
1、求助时,务必在顶楼一次性把问题交代清楚,建议给出完整有针对性的样本,样本过大可发网盘分享链接。勿发无意义的标题
2、使用 code 标记把代码部分括起来(选中代码后,单击回复框的 <> 按钮),以便复制。问题解决后,请编辑顶楼帖子在标题前面注明[已解决]


    恩,以后会注意的,多谢大神
作者: zhangop9    时间: 2020-11-26 08:50

留个记号,用的上




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