knechtibus
Goto Top

Hex Zeichen mittels Batch in Dateien vergleichen

Hallo miteinander,

ich habe ein kleines 3 Dateien Problem. In der Datei dat1.txt stehen mehrere Hexwerte untereinander,z.B.:

40000001
80000001
40000002
80000002
40000003
...
...

Nun soll in einer Datei dat2 nach genau diesen Hexwerten gesucht werden und wenn ein Wert nur einmal auftritt, soll dieser dann in die Datei dat3.txt kopiert werden. Hatte schonmal ein ähnliches Problem, da ging es aber um ganz normale ASCII-Zeichen. Hier ist es nun zwingend notwendig nach den jeweiligen Hexzeichen aus dat1.txt zu suchen.
Freue mich auf eure Antworten.

MfG
knechtibus

Content-ID: 123040

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

Ausgedruckt am: 20.11.2024 um 07:11 Uhr

bastla
bastla 19.08.2009 um 12:36:46 Uhr
Goto Top
Hallo knechtibus!

Da ohnehin immer nach Text gesucht wird, ist es egal, ob dieser Text als Hexwert interpretiert werden kann ...
@echo off & setlocal
set "D1=D:\dat1.txt"  
set "D2=D:\dat2.txt"  
set "D3=D:\dat3.txt"  

if exist "%D3%" del "%D3%"  
for /f "usebackq" %%i in ("%D1%") do call :ProcessLine "%%i"  
goto :eof

:ProcessLine
for /f %%i in ('find /i /c %1^<"%D2%"') do set "Anzahl=%%i"  
if %Anzahl%==1 >>"%D3%" echo %~1  
goto :eof
Grüße
bastla
81825
81825 19.08.2009 um 12:55:38 Uhr
Goto Top
Hi,
wozu die Abfrage? Die Datei soll doch in jedem Fall weg.

06. if exist "%D3%" del "%D3%"
del "%D3%"  2>nul  
knechtibus
knechtibus 19.08.2009 um 13:18:30 Uhr
Goto Top
Hallo bastla,

vielen Dank für deinen Lösungsvorschlag. Das Problem nur ist das die Werte aus dat1 in dat2 nur als ASCII vorliegen(also irgendwelche kryptischen Sonderzeichen). Ich kann also nicht nur nach den Strings aus dat1 suchen sondern müsste irgendwie die ASCII zeichen als die Hexwerte die sie ja sind, interpretieren.

MfG
knechtibus
81825
81825 19.08.2009 um 13:43:49 Uhr
Goto Top
Zitat von @knechtibus:
Das Problem nur ist das die Werte aus dat1 in dat2 nur als ASCII vorliegen(also
irgendwelche kryptischen Sonderzeichen).

Dann wäre es doch sicher sinnvoll, du würdest hier mal ein konkretes Beispiel vorlegen.
bastla
bastla 19.08.2009 um 13:44:27 Uhr
Goto Top
@81825
wozu die Abfrage?
Obwohl ich ohnehin dazu neige, "quick & dirty" zu coden, habe ich trotzdem eine gewisse Hemmung, einen (wenn auch behandelten) Fehler vorsätzlich zu produzieren ...

... aber natürlich funktioniert Dein Vorschlag.

Grüße
bastla
81825
81825 19.08.2009 um 13:47:28 Uhr
Goto Top
Ein FCB muss in jedem Fall angelegt werden, ob nun mit FindFirst oder mit EraseFile. Ich sehe in meiner Vorgehensweise keinen absichtlich produzierten Fehler. face-wink
bastla
bastla 19.08.2009 um 13:48:40 Uhr
Goto Top
Hallo knechtibus!

Weshalb stellst Du die gesuchten Zeichen dann nicht auch gleich in der gewünschten Schreibweise in die "dat1.txt"?

Soferne, wie es sich für mich liest, in "dat2.txt" (ASCII?- / ANSI?- / Unicode?-)Zeichen stehen, ist es sinnvoller, VBS zu verwenden (wenn es dagegen keine Einwände gibt) ...

Grüße
bastla
bastla
bastla 19.08.2009 um 13:49:44 Uhr
Goto Top
@81825
Ich sehe in meiner Vorgehensweise keinen absichtlich produzierten Fehler. face-wink
Warum dann das schamhafte "2>nul"? face-wink

Grüße
bastla
81825
81825 19.08.2009 um 13:56:49 Uhr
Goto Top
Stimmt. Darauf könnte man verzichten. Wenn das in einem Batch mit mehreren Befehlen ausgeführt wird, sieht die Meldung "Datei nicht gefunden" sowieso niemand face-smile
knechtibus
knechtibus 24.08.2009 um 10:18:57 Uhr
Goto Top
Hallo,

angeregte Diskussion scheint das ja hier zu sein face-smile Möchte euch auf jeden Fall für eure Ideen danken. Mit VBS hab ich leider null Erfahrung insofern fällt das erstmal flach oder etwas geschriebenes müsste mir erklärt werden face-smile Die Konvertierung des jeweiligen HEX Wertes in ein ASCII zeichen hab ich jetzt nochmal ausprobiert, klappt aber leider auch nicht. Naja mal schauen ob ich evtl. doch noch was finde.

MfG
knechtibus
bastla
bastla 24.08.2009 um 17:20:15 Uhr
Goto Top
Hallo knechtibus!

Solange Du nicht den Zusammenhang zwischen Datei1 und Datei2 (= die Codierung) geklärt hast und auch kein Beispiel der Datei2 postest (mit ""-Formatierung), wirst Du wohl tatsächlich selbst die Lösung finden müssen ...

Grüße
bastla
knechtibus
knechtibus 25.08.2009 um 09:02:37 Uhr
Goto Top
Hallo bastla,

entschuldige, dass hab ich wirklich noch nicht so richtig klar gemacht. Also die Datei 1 ist eine ganz normale .txt, die Datei 2 im Format .rf7 und das ist evtl. auch ein Problem. Die Werte in Datei 1 liegen wie folgt vor:

40000001
80000001
40000002
80000002
40000003

Die .rf7 Datei mit dem Editor geöffnet präsentiert sich folgendermaßen, nur kryptische Sonderzeichen:

      A   @          g 4  #                  ÿ                     A   €         g 4  #                  ÿ              

In Datei 2 sind die interessanten Zeichen das "@" + 3 Zeichen und das "€" + 3 Zeichen. Diese repräsentieren in diesem Fall die ersten beiden HEX-Werte aus Datei 1.
Tja so siehts aus, ich weiß nun nicht ob VBS das vollbringen kann die Werte aus dat1.txt in dat2.rf7 zu suchen und nur dann in dat3.txt zu kopieren, wenn sie nur 1 mal in dat2.rf7auftreten.
Ich hoffe der Zusammenhang ist nun etwas klarer geworden?!

MfG
knechtibus
bastla
bastla 25.08.2009 um 10:12:04 Uhr
Goto Top
Hallo knechtibus!

Dann versuch es mal damit:
Set fso = CreateObject("Scripting.FileSystemObject")  
D1 = "D:\dat1.txt"  
D2 = "D:\dat1.txt"  
D3 = "D:\dat1.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
Gespeichert werden muss das Script mit der Endung ".vbs". Falls in der "dat3.txt" der Hexcode aus "dat1.txt" stehen soll, in Zeile 15 "WriteLine P" durch "WriteLine C" ersetzen.

Eine Erklärung dazu gibt's bei Bedarf später ...

Grüße
bastla
knechtibus
knechtibus 25.08.2009 um 10:33:51 Uhr
Goto Top
Hallo bastla,

ich danke dir für deine Antwort. Zu aller erst: ich denke mal die drei Variablen die am Anfang benannt werden, sollen unterschiedlich sein ;) Das hab ich mal in meiner Unkenntnis interpretiert. Wenn ich das Script nun ausführe ackert mein Rechner ca. 5 Sekunden lang und dann kommt eine Fehlermeldung:

Runtime Error
Program: C:\WINNT\System32\WScript.exe
abnormal program termination

Könnte es daran liegen das eine der Dateien sehr groß ist?! (Die Datei dat2.rf7 ist ca. 50 MB groß)

MfG
knechtibus
knechtibus
knechtibus 25.08.2009 um 10:58:34 Uhr
Goto Top
Hallo bastla,

es lag wirklich an der Dateigröße, habs gerade nochmal mit einer kleineren Datei ausprobiert. Allerdings kaum ist das eine Problem behoben, zeigt sich auch gleich das nächste. Beim Ausführen wird folgende Fehlermeldung ausgegeben:

Skript: C:\Test_HEX.vbs
Zeile: 12
Zeichen: 9
Fehler: Typen unverträglich: '[string: "&H @"]'
Code: 800A000D
Quelle: Laufzeitfehler in VBScript

Damit kann ich leider nicht so viel anfangen face-sad

MfG
knechtibus
bastla
bastla 25.08.2009 um 14:42:13 Uhr
Goto Top
Hallo knechtibus!

Die Fehlermeldung deutet auf einen nicht als Hexwert interpretierbaren Inhalt der "dat1.txt" hin - in der angegebenen Scriptzeile werden jeweils 2 Zeichen zu einem 8-Bit-Hexwert kombiniert, mit der Funktion Chr() in das entsprechende (ANSI-) Zeichen umgewandelt und dem Suchstring P hinzugefügt.

Die Umwandlung muss natürlich scheitern, wenn der Ausgangs(Hex-)wert " @" lautet ...

Grüße
bastla

P.S.:
Zu aller erst: ich denke mal die drei Variablen die am Anfang benannt werden, sollen unterschiedlich sein ;)
Typischer Fall von Verschlimmbesserung - ich hatte ursprünglich Parameter verwendet, wollte das Script dann zum Testen vereinfachen und habe den Dateinamen beim Posten zwar noch an die entsprechenden Stellen kopiert, aber dann nicht mehr angepasst - sorry, aber Du hast ja richtig analysiert und korrigiert ... face-wink
bastla
bastla 25.08.2009 um 14:46:23 Uhr
Goto Top
Kommentar nach oben verschoben ...
knechtibus
knechtibus 25.08.2009 um 15:15:20 Uhr
Goto Top
Hallo bastla,

Die Fehlermeldung deutet auf einen nicht als Hexwert interpretierbaren Inhalt der "dat1.txt" hin

was so viel bedeutet wie? Das VBS mit den Werten aus dat1.txt nicht klar kommt? Kann man dem irgendwie abhilfe schaffen?

MfG
knechtibus
bastla
bastla 25.08.2009 um 15:23:51 Uhr
Goto Top
Hallo knechtibus!

Dass VBS mit den Werten aus dat1.txt nicht klar kommt?
Wenn in der "dat1.txt" nur Hexwerte stehen (genauer: alle Zeilen nur eine gerade Anzahl von Zeichen aus dem Bereich "0" bis "9" und "A" bis "F" bzw "a" bis "f" - also etwa keine Leerzeichen - enthalten), dürfte es kein Problem geben - zumindest werden Deine oben geposteten Beispielzeilen problemlos verarbeitet.

Grüße
bastla
knechtibus
knechtibus 26.08.2009 um 08:21:53 Uhr
Goto Top
Hallo bastla,

ich hatte aus versehen noch ein @ in der dat1.txt zu stehen. Schön blöd, hätte ich auch selbst mal drauf kommen bzw. nachgucken können. Nun wird keine Fehler mehr angezeigt und die .vbs ausgeführt. Das Problem das jetzt noch besteht: Es wird trotz nur einmalig auftretenden HEX-Werten keine dat3.txt angelegt. Habe die HEX-Werte aus dat1.txt extra noch mit einem HEX-Editor in dat2.txt gesucht um sicher zu sein, dass diese wirklich nur einmal auftreten. Genau diese nur einmal auftretenden Werte sollen ja in die dat3.txt geschrieben werden. Das Script wird auf jeden Fall ausgeführt denn der Rechner arbeitet ein paar Sekunden und eine vorher erstellte, leere dat3.txt wird gelöscht.
Interpretiert er die HEX-Werte evtl. einzeln und nicht als die 4-Zeichen-Folge die sie eigentlich darstellen?

MfG
knechtibus
knechtibus
knechtibus 01.09.2009, aktualisiert am 18.10.2012 um 18:39:11 Uhr
Goto Top
Hallo miteinander,

da es ja offensichtlich mit VBS besser zu realisieren ist, markiere ich diesen Beitrag mal als gelöst und es kann weiter in dem entsprechenden VBS Beitrag diskutiert werden.

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

MfG
knechtibus