knechtibus
Goto Top

Mit VBS Hex-Werte aus Textdatei auslesen und mit anderen vergleichen

Hallo miteinander,

ich habe zwei Textdateien vorliegen, aus denen bestimmte Werte miteinander verglichen werden sollen. Die dat1.txt enthält Hex-Werte in folgender Formatierung:

40000018
80000018
40000019
80000019
4000001A
8000001A
...
...

Diese Werte sollen Zeile für Zeile ausgelesen werden und dann in der dat2.txt gesucht werden. Soweit eigentlich kein Problem aber die Werte liegen in der dat2.txt nur als kryptische Sonderzeichen vor:

      A   @          g 4  #                  
       A   €         g 4  #                  
...
...

Wenn die in dat1.txt eingelesenen Werte nur 1 mal in dat2.txt vorkommen, sollen genau diese Werte in die Datei dat3.txt geschrieben werden. Folgendes habe ich schon selbst ausprobiert aber leider immer ohne Erfolg.

Set fso = CreateObject("Scripting.FileSystemObject")  
D1 = "C:\test HEX\dat1.txt"  
D2 = "C:\test HEX\dat2.txt"  
D3 = "C:\test HEX\dat3.txt"  

T = fso.OpenTextFile(D2).ReadAll
If fso.FileExists(D3) Then fso.DeleteFile(D3)
H = Split(fso.OpenTextFile(D1).ReadAll, vbCrLF)
For Each C In H
    P = ""  
    For i = 1 To Len(C) Step 2
        P = P & Chr("&H" & Mid(C, i, 2))  
    Next
    X = InStr(T, P)
    If X > 0 And X < Len(T) Then If InStr(X + 1, T, P) = 0 Then fso.OpenTextFile(D3, 8, True).WriteLine P
Next

Das Problem hierbei ist, dass die Werte aus dat1.txt immer nur als 1 einzelnes ASCII Zeichen übersetz werden. Somit wird der Wert nicht in die dat3.txt geschrieben, obwohl der Wert nicht in der dat2.txt enthalten ist. Hoffe einer von euch hat eine Idee wie ich das Script noch retten kann. Freu mich auf eure Antworten.

MfG
knechtibus

Content-Key: 123726

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

Printed on: April 18, 2024 at 17:04 o'clock

Member: waldgnarf
waldgnarf Aug 28, 2009 at 18:02:56 (UTC)
Goto Top
Hi knechtibus, meine Idee währe das du erstmal in deinem Script die kryptischen Sonderzeichen in dat2.txt übersetzt und dann mit dem Vergleichen anfängst.

Übrigens geht das Vergleichen mit ner Bat noch einfacher glaube ich. :
fc text01.txt text02.txt > logUNTERSCHIEDE.txt

Ich hoffe das ich dir helfen konnte.

Gruß waldgnarf
Mitglied: 76109
76109 Aug 29, 2009 at 12:00:35 (UTC)
Goto Top
Hallo knechtibus!

Sorry, habe mich leider geirrt und die Antwort daher entfernt.

Gruß Dieter
Member: bastla
bastla Aug 30, 2009 at 10:07:51 (UTC)
Goto Top
@76109
Der Hexwert 0 Chr("&H00") geht nicht, weil mit 0 das Stringende (EndOfString=0) definiert wird.
Nur als Anmerkung: Für VB(S) stimmt diese Aussage nicht - Chr(0) wird wie jedes andere Zeichen in einem String behandelt (was ja auch aus Deiner "DAT1.TMP" ersichtlich ist) und auch durch InStr() richtig ausgewertet - nachvollziehen kannst Du Letzteres, indem Du per HexEditor in "dat2.txt" anstelle der (durch die Forensoftware konvertierten?) Leerzeichen (Hex "20") passende "00"-Character (und auch ein im Beispiel gar nicht vorhandenes zB "1A"), damit es tatsächlich einen dem Suchmuster entsprechenden Teilstring gibt, schreibst und dann das Script aus dem Eröffnungsbeitrag darauf anwendest ...

... allerdings setzt dies voraus, dass "dat2.txt" ANSI-codiert wäre, was aber vermutlich beim Original nicht der Fall und damit der Grund des Scheiterns ist.

Grüße
bastla
Mitglied: 76109
76109 Aug 30, 2009 at 11:35:22 (UTC)
Goto Top
Hallo bastla!

Ups, Du hast Recht und ich mich zu meiner Verwirrung geirrtface-smile

Ich war der Überzeugung, das ein Stringende mit Chr(0) gekennzeichnet wird und dachte daher das die String-Variable P nicht funktioniert.

Gruß Dieter
Member: knechtibus
knechtibus Aug 31, 2009 at 07:12:39 (UTC)
Goto Top
Hallo waldgnarf,

ich wollte es anfänglich eigentlich auch mit einer Batch Datei realisieren aber das stellte sich dann doch heraus das VBS eigentlich besser dazu geeignet scheint. Trotzdem vielen Dank für deine Idee.

MfG
knechtibus
Member: knechtibus
knechtibus Sep 01, 2009 at 06:54:13 (UTC)
Goto Top
Hallo miteinander,

ich werd mal den neuesten Stand kund tun. Folgendes Script ist im Moment aktuell:

Set fso = CreateObject("Scripting.FileSystemObject")  
D1 = "C:\test HEX\dat1.txt"  
D2 = "C:\test HEX\dat2.txt"  
D3 = "C:\test HEX\dat3.txt"  

If fso.FileExists(D3) Then fso.DeleteFile(D3)
H = Split(fso.OpenTextFile(D1).ReadAll, vbCrLF)
For Each C In H
    P = ""  
    For i = 1 To Len(C) Step 2
        P = P & Chr("&H" & Mid(C, i, 2))  
    Next

    Anzahl = 0
    Set D2Datei = fso.OpenTextFile(D2)
    Do Until D2Datei.AtEndOfStream
        T = D2Datei.ReadLine
        X = InStr(T, P)
        Do While X > 0 And X < Len(T)
            Anzahl = Anzahl + 1
            X = InStr(X + 1, T, P)
        Loop
        If Anzahl > 1 Then Exit Do
    Loop
    D2Datei.Close
    
    If Anzahl = 1 Then fso.OpenTextFile(D3, 8, True).WriteLine C
Next

Das Script startet ordnungsgemäß und der Rechner arbeitet auch bei größeren Dateien ca. 30s. Dann jedoch wird leider keine dat3.txt erstellt, obwohl manche HEX-Werte aus der dat1.txt in der dat2.txt nur einmal auftreten.

@ bastla
Lässt sich so evtl. besser diskutieren face-smile

MfG
knechtibus
Member: waldgnarf
waldgnarf Sep 02, 2009 at 09:41:53 (UTC)
Goto Top
Hi, klappt es mit

fso.CreateTextFile(DATEI, True)
?

Gruß waldgnarf
Member: knechtibus
knechtibus Sep 02, 2009 at 09:59:47 (UTC)
Goto Top
Hallo waldgnarf,

nein leider funktioniert es damit auch nicht face-sad Es scheint so als würde er die Zeilen aus dat1.txt einfach nicht in der dat2.txt finden. Deswegen ist Anzahl ungleich 1 und es wird keine dat3.txt erstellt.

Ich hab aber schon 3 mal überprüft das die Zeilen in dat1.txt wirklich nur 1 mal in dat2.txt vorhanden sind. Komisch...

MfG
knechtibus