[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] [已解决]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


明显进行了排序。。。。这样不正确~求改正~求方法
1

评分人数

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

这个要学习一下,记号

TOP

回复 7# pcl_test


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


赞!

TOP

本帖最后由 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 "完成"
复制代码
1

评分人数

TOP

回复 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
复制代码

TOP

回复 4# pcl_test


    大神,要不要这么屌~才看到您的回答~~~

TOP

本帖最后由 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 "完成"
复制代码
1

评分人数

TOP

求解答~~~指点一下也好啊

TOP

都没人理嘛。。。。

TOP

返回列表