ole-objekt
Goto Top

Batch: Erste Stellen von zwei aufeinander folgenden Zeilen derselben Textdatei vergleichen

Hallo mal wieder,

meine derzeitige Arbeit erfordert leider viele Vergleiche von verschiedenen Dateien und nun also auch innerhalb derselben Datei. Ich bin kein großer Batch-Freak und musste nun schon häufiger hier fragen stellen - herzlichen Dank an alle, die mir bisher so wunderbar weitergeholfen haben!

Mein heutiges Problem besteht darin: Wenn in einer Datei (2 GB) in zwei aufeinanderfolgenden Zeilen die ersten 7 Stellen identisch sind, handelt es sich um einen Fehler. In diesem Fall möchte ich eine der beiden Zeilen in eine Zieldatei kopieren, denn am Zeilenende steht ein Identifikator, mit dem ich genauere Fehleranalyse betreiben kann. Welche der beiden Zeilen in die Zieldatei geschrieben werden, ist egal.

Meine bisherige Idee, die mich noch zu keinem endgültigen Ergebnis gebracht hat, lautet:

@echo off
setlocal enabledelayedexpansion 

set Quelle=Quelldatei.txt
set Ziel=Zieldatei.txt 
 
set /a var1=0

for /f "tokens=* delims=" %%G in (%Quelle%) do (   
  set /a var2=%%G
  set /a var2=!var2:~0,7!
  if !var1!=!var2! then >>"%Ziel%" echo %%G  
  set /a var1=!var2!
)

Wahrscheinlich habe ich noch irgendwo die Ausrufungszeichen falsch gesetzt? Rein vom Ablauf her sollte doch alles stimmen, oder was übersehe ich gerade?

Herzlichen Dank schon mal wieder an alle, die das hier kommentieren werden.

Gruß, Olaf

Content-Key: 281051

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

Printed on: April 25, 2024 at 01:04 o'clock

Member: rubberman
Solution rubberman Aug 24, 2015, updated at Dec 02, 2015 at 10:32:23 (UTC)
Goto Top
Hallo Olaf.

set /a
Ist für numerische Zuweisungen/Berechnungen
if !var1!=!var2! ...
Vergleiche mit doppeltem Gleichheitszeichen.
... then ...
Falsche Sprache.

Ungetestet:
@echo off
setlocal enabledelayedexpansion 

set "Quelle=Quelldatei.txt"  
set "Ziel=Zieldatei.txt"  
 
set "var1=0"  

for /f "usebackq delims=" %%G in ("%Quelle%") do (   
  set "var2=%%G"  
  set "var2=!var2:~0,7!"  
  if "!var1!"=="!var2!" >>"%Ziel%" echo %%G  
  set "var1=!var2!"  
)
Grüße
rubberman
Member: ole-objekt
ole-objekt Aug 24, 2015 at 19:21:39 (UTC)
Goto Top
Hallo,
danke es ist schon spät und bei einigem war ich einfach unaufmerksam und habe es trotz mehrmaligem Hinschauen nicht selber gefunden.
Jetzt sitze ich aber vor einem noch erstaunlicheren Phänomen:
Mit einer Testdatei (3 KB) funktioniert die Batch einwandfrei, ohne echo off sehe ich dann kurz die Zeilen vorbeirauschen und am Ende ist die Ausgabedatei fertig.
Mit der eigentlichen Quelldatei (2,5 GB) passiert nichts. Das cmd Fenster blitzt kurz auf und keine Zieldatei wird erstellt. Mit einem Pause nach der Klammer sehe ich dann, dass keine Fehlermeldung erzeugt wird.
Hast Du (oder sonst jemand) eine Idee?
Gruß, Olaf
Member: rubberman
Solution rubberman Aug 24, 2015, updated at Dec 02, 2015 at 10:32:28 (UTC)
Goto Top
Hallo Olaf.

Das cmd Fenster blitzt kurz auf
Dann auch in diesem Thread erneut die Frage: In welchem Zeichensatz liegt die Datei vor?

Teste mit folgender Zeile 9:
for /f "delims=" %%G in ('type "%Quelle%"') do (

Grüße
rubberman
Member: ole-objekt
ole-objekt Dec 02, 2015 at 10:32:06 (UTC)
Goto Top
Hallo rubberman,

ich habe das damals aus den Augen verloren, jetzt musste ich wieder an die Sache ran. Deshalb auch erst jetzt die Rückmeldung. Sehr wahrscheinlich lag die Datei damals mit Unix-Zeilenumbrüchen vor. Inzwischen habe ich die Datei durch einen vorhergehenden Arbeitsschritt bereits in Windows-Format gewandelt und alles funktioniert richtig.

Herzlichen (verspäteten) Dank!

Olaf
Member: rubberman
rubberman Dec 02, 2015 at 18:04:13 (UTC)
Goto Top
Hallo Olaf.

damals mit Unix-Zeilenumbrüchen
Hmm. Das wäre ja ein <LF> (bei Windows, die Kombination <CR><LF>). Das stört die FOR /F Schleife nicht, das <CR> wird dort sowieso ignoriert. Eher war es die obligatorische UTF-8 Codierung bei *nixoiden Betriebssystemen. Wenn es statt UNIX ein altes Mac OS (bis Version 9) gewesen wär, hätte ich es verstanden. Dort ist der Zeilenumbruch ein einzelnes <CR>. Endgültig lässt sich das wohl nun nicht klären, aber Hauptsache es funktioniert ... face-wink

Grüße
rubberman