Board logo

标题: [问题求助] [已解决]VBS如何匹配相同的字符串然后提取出相应的信息? [打印本页]

作者: sweet惜缘    时间: 2015-6-3 10:34     标题: [已解决]VBS如何匹配相同的字符串然后提取出相应的信息?

NEW_DG文件中的内容是这样的:
DG00127
DG01164
DG00132
DG01672
DG00188
DG01672
DG01672
DG01672
DG01158
DG01672
DG01672
DG00126
DG01157
DG01672
DG01672
DG01731
DG01672
DG01672
DG00183
DG01672


$DG中的内容是这样的:
DG00001        10147
DG00002        10148
DG00003        10149
DG00004        10150
DG00005        10151
DG00006        10152
DG00007        10153
DG00008        10154
DG00009        10155
DG00010        10156
DG00011        10157
DG00012        10158
DG00013        10159
DG00014        10160
DG00015        10161
DG00016        10162
DG00017        10163
DG00018        10164
DG00019        10165
DG00020        10166
DG00021        10167
DG00022        10168
DG00023        10169
DG00024        10170


我想用NEW_DG文件去匹配$DG,找到相同的字符串则把$DG中的那一行提取出来放到新的txt中,下面是我的程序,得出来的结果是正确的,但是却对提取的结果进行了排序,我不希望排序,只想与NEW_DG文件中字符串的顺序一样,大神谁有办法~~不胜感激!:
  1. #&Gawk -f %0  $DG.txt&Exit
  2. BEGIN {
  3.     while((getline<"NEW_DG.txt")>0) type1[a++]=$0;
  4.     for(i=1;i<2;i++) printf("ENTRY                 \n")>>"$type"i".txt";
  5. }
  6. NR>1{
  7.     for(i in type1)
  8.         if($1==type1[i]) print $0 >>"$NR.txt";
  9. }
复制代码
得出来的结果是这样的
DG00002        10148
DG00002        10148
DG00003        10149
DG00003        10149
DG00003        10149
DG00003        10149
DG00004        10150
DG00004        10150
DG00005        10151
DG00005        10151
DG00005        10151
DG00006        10152
DG00006        10152
DG00006        10152
DG00006        10152
DG00007        10153
DG00007        10153


明显进行了排序。。。。这样不正确~求改正~求方法
作者: sweet惜缘    时间: 2015-6-3 15:28

都没人理嘛。。。。
作者: sweet惜缘    时间: 2015-6-3 16:01

求解答~~~指点一下也好啊
作者: pcl_test    时间: 2015-6-3 16:26

本帖最后由 pcl_test 于 2015-8-4 15:35 编辑

VBS
  1. Dim fso,File1,File2,File3,MyArray(),arr
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set File1= fso.OpenTextFile(".\$DG.txt", 1 , True)
  4. Set File2= fso.OpenTextFile(".\NEW_DG.txt", 1 , True)
  5. Set File3 = fso.CreateTextFile(".\结果.txt", 2 ,False)
  6. i=0
  7. s=""
  8. Do While File1.AtEndOfStream <> True
  9. ReDim Preserve MyArray(i)
  10. MyArray(i)=File1.ReadLine
  11. i=i+1
  12. Loop
  13. File1.Close
  14. Do While File2.AtEndOfStream <> True
  15. t=File2.ReadLine
  16. For j=0 To UBound(MyArray)
  17. arr=Split(MyArray(j)," ")
  18. If t = arr(0) Then
  19. s=s&MyArray(j)&vbCrLf
  20. End If
  21. Next
  22. Loop
  23. File3.WriteLine s
  24. File2.Close
  25. File3.Close
  26. Msgbox "完成"
复制代码

作者: sweet惜缘    时间: 2015-8-3 17:27

回复 4# pcl_test


    大神,要不要这么屌~才看到您的回答~~~
作者: 回家路上    时间: 2015-8-5 19:11

回复 4# pcl_test


请问,这个用批处理的话,怎么搞。我这样,循环是不是太多太多了。特别慢,怎么优化优化啊。
  1. @echo off
  2. (for /f %%a in (NEW_DG.txt) do (
  3. set e=
  4. for /f "tokens=1,2 delims= " %%i in ($DG.txt) do (
  5. if "%%a" equ "%%i" (echo;%%i %%j&set e=1)
  6. )
  7. if not defined e echo;%%a
  8. ))>tmp
  9. pause & exit /b
复制代码

作者: pcl_test    时间: 2015-8-5 21:59

本帖最后由 pcl_test 于 2015-8-5 22:12 编辑

回复 6# 回家路上

你的思路跟我之前的vbs代码的是一样的,用NEW_DG.txt每行去遍历匹配$DG.txt,这样效率自然是慢的,批处理的话有个灵活好用的“变量表”机制,可充当“临时文件”来储存数据,要取某个数据时只要扩展相应的变量名即可,这样就可以避免多次的重复动作,看你新发的帖子里的代码,群友们提供的思路就是如此,通过后期学习也可了解到vbs中也可以用Scripting.Dictionary组件实现快速索引访问的机制
  1. Dim fso,File1,File2,File3,objDict,arr
  2. Set objDict = CreateObject("Scripting.Dictionary")
  3. Set fso = CreateObject("Scripting.FileSystemObject")
  4. Set File1 = fso.OpenTextFile(".\$DG.txt", 1)
  5. Set File2 = fso.OpenTextFile(".\NEW_DG.txt", 1)
  6. Set File3 = fso.CreateTextFile(".\结果.txt", 2)
  7. Do While File1.AtEndOfStream <> True
  8.     arr = Split(File1.ReadLine," ")
  9.     objDict.Add arr(0), arr(1)
  10. Loop
  11. File1.Close
  12. Do While File2.AtEndOfStream <> True
  13.     t = File2.ReadLine
  14.     If objDict.Exists(t) Then
  15.        File3.WriteLine t&" "&objDict.Item(t)
  16.     End If
  17. Loop
  18. File2.Close
  19. File3.Close
  20. Msgbox "完成"
复制代码

作者: 回家路上    时间: 2015-8-5 23:09

回复 7# pcl_test


嗯,越来越觉得脚本的方便和强大。一步一步慢慢来。
我搜索了关键字变量表和字典相关算法,确实当初想到这的人也是好厉害。


赞!
作者: zhangop9    时间: 2020-12-8 11:35

这个要学习一下,记号




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