如果是这样输出,VBscript检查另一个数组中是否存在1个数组的元素

时间:2017-03-16 19:58:27

标签: arrays vbscript

嘿伙计我有两个看起来像

的文本文件
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

2 个答案:

答案 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位驱动程序,请按照从ab的碎屑,安装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

只会比较第一行与第一行,第二行与第二行等等。