嘿伙计我有两个看起来像
的文本文件Text File 1 Text File2
1,asd | 4,sfsdfsdf,sdfdsf
2,dsf | 5,werewr,errret
3,dfg | 6,rty,dfgree,werer
4,dfg | 7,sdf,werwer,asdd
5,fgh | 8,tye,werew,rtyrt
我想检查file2以查看column1(数字)是否与file1匹配。然后将file2中的内容打印到文件中。在这种情况下,4和5匹配
Desired Result : 4,sfsdfsdf,sdfdsf
5,werewr,errret
我有
Dim arrFileLines()
Dim myarray()
Dim line
Dim eachline
Dim found
Dim tokenid
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(internal_txt, 1)
Do Until objFile.AtEndOfStream
Redim Preserve arrFileLines(i)
arrFileLines(i) = objFile.ReadLine
line=arrFileLines(i)
eachline=split(line,",")
tokenid=eachline(0)
' wscript.echo tokenid
i = i + 1
Loop
objFile.Close
Set objFile = objFSO.OpenTextFile(disabled_txt, 1)
Do Until objFile.AtEndOfStream
Redim Preserve myarray(j)
myarray(j) = objFile.ReadLine
j = j + 1
Loop
objFile.Close
For l = lbound(arrFileLines) to ubound(arrFileLines) Step 1
if arrFileLines(l) = myarray(l) then
wscript.echo arrFileLines(l)
end if
'wscript.echo arrFileLines(l)
Next
答案 0 :(得分:1)
您的问题应该通过对您的txt文件执行SQL内部联接来解决。使用ADO很容易。演示:
cscript 42843704-2.vbs
--------------- .\42843704-2.vbs
Option Explicit
Const adClipString = 2 ' 00000002
Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject")
Dim sF
For Each sF In Split(".\42843704-2.vbs .\schema.ini .\42843704-1.txt .\42843704-2.txt")
WScript.Echo "---------------", sF
WScript.Echo oFS.OpenTextFile(sF).ReadAll()
WScript.Echo
Next
Dim sDir : sDir = oFS.GetAbsolutePathName(".\")
Dim sCS : sCS = Join(Array( _
"Provider=Microsoft.Jet.OLEDB.4.0" _
, "Data Source=" & sDir _
, "Extended Properties='" & Join(Array( _
"text" _
), ";") & "'" _
), ";")
Dim oDb : Set oDb = CreateObject("ADODB.Connection")
oDb.Open sCS
'WScript.Echo oDb.ConnectionString
' From simple SELECT to INNER JOIN in 4 easy steps
'Dim sSQL : sSQL = "SELECT A.ID FROM [42843704-1.txt] AS A"
'Dim sSQL : sSQL = "SELECT A.ID, B.BB, B.CC FROM [42843704-1.txt] AS A, [42843704-2.txt] AS B"
'Dim sSQL : sSQL = "SELECT A.ID, B.BB, B.CC FROM [42843704-1.txt] AS A, [42843704-2.txt] AS B WHERE A.ID = B.I
D"
Dim sSQL : sSQL = "SELECT A.ID, B.BB, B.CC FROM [42843704-1.txt] AS A INNER JOIN [42843704-2.txt] AS B ON A.ID
= B.ID"
WScript.Echo sSQL
Dim oRS : Set oRS = oDb.Execute(sSQL)
WScript.Echo oRS.GetString(adClipString, , vbTab, vbCrLf, "nix")
oRS.Close
oDb.Close
--------------- .\schema.ini
[42843704-1.txt]
ColNameHeader=False
Format=Delimited(,)
DecimalSymbol=.
Col1=ID Integer
Col2=AA Char Width 50
[42843704-2.txt]
ColNameHeader=False
Format=Delimited(,)
DecimalSymbol=.
Col1=ID Integer
Col2=BB Char Width 50
Col3=CC Char Width 50
--------------- .\42843704-1.txt
1,asd
2,dsf
3,dfg
4,dfg
5,fgh
--------------- .\42843704-2.txt
4,sfsdfsdf,sdfdsf
5,werewr,errret
6,rty,dfgree,werer
7,sdf,werwer,asdd
SELECT A.ID, B.BB, B.CC FROM [42843704-1.txt] AS A INNER JOIN [42843704-2.txt] AS B ON A.ID = B.ID
4 sfsdfsdf sdfdsf
5 werewr errret
要看到这种策略确实有效,并且能够实现这一目标。并且很好地扩展,将上面的内容与SameMethodForOtherProblem
进行比较P.S。在64位Windows机器上使用32位控制台,以便能够访问驱动程序。
P.P.S。要获得64位驱动程序,请按照从a到b的碎屑,安装64位驱动程序,然后更改演示的 1 行:
"Provider=Microsoft.Jet.OLEDB.4.0" _
到
"Provider=Microsoft.ACE.OLEDB.12.0" _
答案 1 :(得分:0)
我对你的方法有一些问题/改变 首先 - 如果你不需要文本,只需要数字,我建议使用List(of Number)(检查语法,我的VB生锈)而不是数组。 List.Add()将派上用场,基本上可以为您调整大小。此外 - 不要浪费记忆来存储逗号之后的内容,因为这是不必要的。
其次 - 没有理由将第二个文件存储在所有位置。这可以通读,并使用List.Contains(从第二个文件中的行读取的值)逐行确定输出。
最后,上述观点是关键 - 对于你的结构方式,最后的检查是错误的。您只检查匹配的元素,而不是扫描原始列表。 含义:
if arrFileLines(l) = myarray(l) then
只会比较第一行与第一行,第二行与第二行等等。