标题: [问题求助] [已解决]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文件中字符串的顺序一样,大神谁有办法~~不胜感激!:- #&Gawk -f %0 $DG.txt&Exit
- BEGIN {
- while((getline<"NEW_DG.txt")>0) type1[a++]=$0;
- for(i=1;i<2;i++) printf("ENTRY \n")>>"$type"i".txt";
- }
- NR>1{
- for(i in type1)
- if($1==type1[i]) print $0 >>"$NR.txt";
-
- }
复制代码
得出来的结果是这样的
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- Dim fso,File1,File2,File3,MyArray(),arr
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set File1= fso.OpenTextFile(".\$DG.txt", 1 , True)
- Set File2= fso.OpenTextFile(".\NEW_DG.txt", 1 , True)
- Set File3 = fso.CreateTextFile(".\结果.txt", 2 ,False)
- i=0
- s=""
- Do While File1.AtEndOfStream <> True
- ReDim Preserve MyArray(i)
- MyArray(i)=File1.ReadLine
- i=i+1
- Loop
- File1.Close
- Do While File2.AtEndOfStream <> True
- t=File2.ReadLine
- For j=0 To UBound(MyArray)
- arr=Split(MyArray(j)," ")
- If t = arr(0) Then
- s=s&MyArray(j)&vbCrLf
- End If
- Next
- Loop
- File3.WriteLine s
- File2.Close
- File3.Close
- Msgbox "完成"
复制代码
作者: sweet惜缘 时间: 2015-8-3 17:27
回复 4# pcl_test
大神,要不要这么屌~才看到您的回答~~~
作者: 回家路上 时间: 2015-8-5 19:11
回复 4# pcl_test
请问,这个用批处理的话,怎么搞。我这样,循环是不是太多太多了。特别慢,怎么优化优化啊。- @echo off
- (for /f %%a in (NEW_DG.txt) do (
- set e=
- for /f "tokens=1,2 delims= " %%i in ($DG.txt) do (
- if "%%a" equ "%%i" (echo;%%i %%j&set e=1)
- )
- if not defined e echo;%%a
- ))>tmp
- 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组件实现快速索引访问的机制- Dim fso,File1,File2,File3,objDict,arr
- Set objDict = CreateObject("Scripting.Dictionary")
- Set fso = CreateObject("Scripting.FileSystemObject")
- Set File1 = fso.OpenTextFile(".\$DG.txt", 1)
- Set File2 = fso.OpenTextFile(".\NEW_DG.txt", 1)
- Set File3 = fso.CreateTextFile(".\结果.txt", 2)
- Do While File1.AtEndOfStream <> True
- arr = Split(File1.ReadLine," ")
- objDict.Add arr(0), arr(1)
- Loop
- File1.Close
- Do While File2.AtEndOfStream <> True
- t = File2.ReadLine
- If objDict.Exists(t) Then
- File3.WriteLine t&" "&objDict.Item(t)
- End If
- Loop
- File2.Close
- File3.Close
- Msgbox "完成"
复制代码
作者: 回家路上 时间: 2015-8-5 23:09
回复 7# pcl_test
嗯,越来越觉得脚本的方便和强大。一步一步慢慢来。
我搜索了关键字变量表和字典相关算法,确实当初想到这的人也是好厉害。
赞!
作者: zhangop9 时间: 2020-12-8 11:35
这个要学习一下,记号
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |