breede
Goto Top

Arrays miteinander vergleichen und Gemeinsamkeiten ausgeben (VBScript)

Hi,

ich habe 2 Textdateien die aus 2 Arrays enstanden sind.

Es ist nun notwendig diese zu vergleichen und die Gemeinsamkeiten in ein drittes Array/Datei auszugeben.

Beispiel:

Array1

Hallo
Test
4

6
32345
44g

Array2

1
2
3
4
Hallo
5
Test

Die Ausgabe aus dem Beispiel müsste nun seien:

Hallo
Test
4

Habt ihr eine Idee? Bisher habe ich nur eine Möglichkeit gefunden Zeile für Zeile zu vergleichen, da aber die Werte in beiden Arrays an unterschiedlichen Positionen stehen, war es immer ein Unterschied und wurde so nicht mit ausgegeben.

Danke schonmal.

Gruß
Marcus
[Edit: Dani - 10.12.2007 16:15]
Ich habe mir erlaubt, die einzelnen Schnipsel in einen CODE-Block zu packen. Macht das ganze ein bisschen runder. face-smile Mehr dazu findet ihr Formatierungen in den Beiträgen.

Content-ID: 75655

Url: https://administrator.de/contentid/75655

Ausgedruckt am: 23.11.2024 um 12:11 Uhr

Schi73
Schi73 10.12.2007 um 15:56:20 Uhr
Goto Top
Hallo Markus,

probiers mal so:
Dim WshShell, fso
Dim LogFile, LogFileneu
Dim DateiName, Dateinameneu
Dim Zeile

Set WshShell = CreateObject("WScript.Shell")  
set fso = CreateObject("Scripting.FileSystemObject")  

DateiName="testdatei.txt"  
Dateinameneu="testdateineu.txt"  

Set LogFile = fso.OpenTextFile(Dateiname,1, True)
Set LogFileneu = fso.OpenTextFile(Dateinameneu,2, True)

Do While Not logfile.AtEndOfStream
  Zeile = RTrim(logfile.Readline)
  if len(Zeile) >0 then logfileneu.writeline Zeile
Loop
LogFile.Close
LogFileneu.Close


Gruß Schi
Breede
Breede 10.12.2007 um 16:02:32 Uhr
Goto Top
Danke für die Antwort, aber die Problematik hat sich binnen Sekunden geändert. face-smile

Problem mit den Leerzeilen konnte ich lösen, war wohl ein Geistesblitz.

Derzeitiges Problem ist oben beschrieben.

Danke trotzdem Schi.
Schi73
Schi73 10.12.2007 um 16:10:00 Uhr
Goto Top
Nochmal Hallo Marcus (<-- diesma richtig face-smile)

also neues Script:
Dim WshShell, fso
Dim LogFile1, LogFile2, LogFileneu
Dim DateiName1, DateiName2, Dateinameneu
Dim Zeile1

Set WshShell = CreateObject("WScript.Shell")  
set fso = CreateObject("Scripting.FileSystemObject")  

DateiName1="testdatei1.txt"  
DateiName2="testdatei2.txt"  
Dateinameneu="testdateineu.txt"  

Set LogFile1 = fso.OpenTextFile(Dateiname1,1, True)
Set LogFileneu = fso.OpenTextFile(Dateinameneu,2, True)

Do While Not logfile1.AtEndOfStream
	Zeile1 = RTrim(logfile1.Readline)    
	Set LogFile2 = fso.OpenTextFile(Dateiname2,1, True)
        Do While Not logfile2.AtEndOfStream
    		if Zeile1 = RTrim(logfile2.Readline) then logfileneu.writeline Zeile1
	Loop
	LogFile2.Close
Loop
LogFile1.Close
LogFileneu.Close
So sollte es gehen
Kann evtl. etwas daueren, jenachdem wie groß die Dateien sind

Gruß Schi
Breede
Breede 10.12.2007 um 16:22:26 Uhr
Goto Top
Super, hat funktioniert und da du mir schonmal so gut geholfen hast, versuche ich es gleich nochmal. :P

Ich lasse eine Anweisung in einem Loop laufen und jedesmal gibt er eine Fehlermeldung aus.
Er beendet die Anweisungen in dem Loop zwar so wie gewünscht, jedoch wird durch den Fehler alles was nach dem Loop oder mit eintretendem "EOF", abgebrochen.

Da stehen aber leider noch weitere Verarbeitungen an.


Hier der Code:

Do Until objRecordSet.EOF
strRecordsetInhalt = Trim(objRecordSet.GetString(2, , "|",VbCrLf,""))
objRecordSet.MoveNext
Loop

Fehlermeldung:

N:\Test2.vbs(30, 2) ADODB.Recordset: Entweder BOF oder EOF ist True, oder der aktuelle Datensatz wurde gelöscht. Der angeforderte Vorgang benötigt einen aktuellen Datensatz.

Google konnte mir nicht helfen.
Biber
Biber 10.12.2007 um 16:31:21 Uhr
Goto Top
Moin Breede,

Da stehen aber leider noch weitere Verarbeitungen an.
Da stehen dann aber genauere Beschreibungen an oder der Gesamtplan oder der bis hierhin vorhandene Sourcecode.

Aus dem "Beispiel" im Eröffnungsbeitrag lässt sich nun nicht ableiten, wer denn Dir einen ADODb-RecordSet ins Nest gelegt hat und wofür.

Bitte etwas präzisieren - Shi73 ist zwar gut im Raten, aber das ist eigentlich nicht der Sinn dieses Forums.

Grüße
Biber
Breede
Breede 10.12.2007 um 16:35:46 Uhr
Goto Top
Ok, hier nun der komplette Code.
Const ADS_SCOPE_SUBTREE = 5
Dim fso, file, strRecordsetInhalt, a
Set fso = CreateObject("Scripting.FileSystemObject")  
Set file1 = fso.CreateTextFile("c:\datei1.txt", True)  

Set objConnection = CreateObject("ADODB.Connection")  
Set objCommand =   CreateObject("ADODB.Command")  
objConnection.Provider = "ADsDSOObject"  
objConnection.Open "Active Directory Provider"  
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000  
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE  

objCommand.CommandText = 	"SELECT mail FROM 'LDAP://DC=www,DC=xxx,DC=de' WHERE objectCategory='group'" & _  
							"OR  objectCategory='user'" & _  
							"AND objectCategory='person'" & _  
							"Order by mail"  

Set objRecordSet = objCommand.Execute

Do Until objRecordSet.EOF
	strRecordsetInhalt = Trim(objRecordSet.GetString(2, , "|",VbCrLf,""))  
	strRecordsetInhalt = UCase(strRecordsetInhalt)
	file1.WriteLine(strRecordsetInhalt)
	objRecordSet.MoveNext
Loop
Biber
Biber 10.12.2007 um 17:00:52 Uhr
Goto Top
Danke Breede,

ich habe es in Code-Tags gesetzt, siehe bitte auch Danis Hinweis ganz oben.

Okay, dass mal kein einziger Satz zurückkommt solltest Du ohnehin berücksichtigen, aber auch , dass gar kein Recordset-Object zurückkommt.

Bei der Bedingung kann aber auch nie etwas zurückkommen, oder:
....
WHERE objectCategory='group' " & _  
            " OR  objectCategory='user' " & _  
      " AND objectCategory='person'" &.....  
Die objectCategory kann niemals nicht gleich 'group' AND-whatever sein.

Bestenfalls in einem philosophischen Sinn ("Wer bin ich? Und wenn ja, wie viele?").
Aber das wolltest Du bestimmt nicht hier diskutieren. Und erst recht nicht mit mir.

Achte bitte auch auf ein Mindestmaß an Leerzeichen innerhalb der einzelnen WHERE-clause-Tokens. Du hast zwischen "...= 'group'" und dem ersten Wort der Folgezeile kein Leerzeichen.

Grüße
Biber
Breede
Breede 11.12.2007 um 08:17:15 Uhr
Goto Top
Habe ein paar Änderungen vorgenommen, der Fehler ist aber weiterhin vorhanden. Datensätze bekomme ich aber zurück, den Inhalt der Textdatei bilde ich mir ja nicht ein. face-smile

Jetzt mal etwas schöner.

Const ADS_SCOPE_SUBTREE = 5
Dim fso, strRecordsetInhalt, file1
Set fso = CreateObject("Scripting.FileSystemObject")  
Set file1 = fso.CreateTextFile("n:\datei1.txt", True)  

Set objConnection = CreateObject("ADODB.Connection")  
Set objCommand =   CreateObject("ADODB.Command")  
objConnection.Provider = "ADsDSOObject"  
objConnection.Open "Active Directory Provider"  
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000  
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE  

objCommand.CommandText = 	"SELECT mail FROM 'LDAP://DC=www,DC=xxx,DC=de' WHERE objectCategory='group'  " & _  
							" OR  objectCategory='user' " & _  
							" Order by mail "  

Set objRecordSet = objCommand.Execute

Do While Not objRecordSet.EOF
	strRecordsetInhalt = Trim(objRecordSet.GetString(2, , "|",VbCrLf,""))  
	strRecordsetInhalt = UCase(strRecordsetInhalt)
	file1.WriteLine(strRecordsetInhalt)
	objRecordSet.MoveNext
Loop

file1.Close
Breede
Breede 12.12.2007 um 10:32:59 Uhr
Goto Top
Hier die Lösung:

''''' Konstanten '''''  

Const ADS_SCOPE_SUBTREE = 5

''''' Variablen '''''  

Dim fso
Dim strRecordsetInhalt
Dim File_SAC_Input
Dim File_THR_Input

Set fso = CreateObject("Scripting.FileSystemObject")  
Set File_SAC_Input  = fso.CreateTextFile("N:\SAC_Input.txt", True)  
Set File_THR_Input  = fso.CreateTextFile("N:\THR_Input.txt", True)  

''''' Verbindung zum Active Directory '''''  

Set objConnection = CreateObject("ADODB.Connection")  
Set objCommand =   CreateObject("ADODB.Command")  
objConnection.Provider = "ADsDSOObject"  
objConnection.Open "Active Directory Provider"  
Set objCommand.ActiveConnection = objConnection

objCommand.Properties("Page Size") = 1000  
objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE  

''''' Abfrage und Ausgabe per SQL über LDAP '''''  

objCommand.CommandText = 	" SELECT mail FROM 'LDAP://DC=www,DC=xxx,DC=de' Where mail <> '@' " &_  
							" Order by mail "  

Set objRecordSet = objCommand.Execute

Do Until objRecordSet.EOF
	strRecordsetInhalt = Trim(objRecordSet.GetString(2, , "|",VbCrLf,""))  
	strRecordsetInhalt = UCase(strRecordsetInhalt)
	File_SAC_Input.WriteLine(strRecordsetInhalt)
''''' Hier die Lösung '''''  
	If not objRecordSet.EOF Or objRecordSet.BOF Then
		objRecordSet.movenext
	End If
Loop

File_SAC_Input.Close