Batch-Datei: Überprüfung aus zweiter Tabelle

Chris_999

Newbie
Registriert
Mai 2020
Beiträge
4
Hallo Spezialisten,

als Anfänger möchte ich mich mit folgender Frage an euch wenden:

In Tabelle aaa.txt sollen bestimmte Inhalte (rot markiert) gelöscht werden.

Tabelle aaa.txt:

12300000;1;001780;000000679326;2;04;1989;000;;80
12300000;1;008823;000000814860;1;06;1960;000;;71
12300000;1;011427;000000843754;1;01;1953;000;;80
12300000;1;011450;000000844009;1;02;1954;000;;73

Dies erreiche ich durch ausführen von

@Echo off

set "txt=aaa.txt"
set "temp=output.txt"

for /f "tokens=1-10 delims=; " %%a in (%txt%) do echo %%a;%%b;%%c;%%d;%%e;;%%g >> %temp%
(funktioniert auch)

Ergebnis in Tabelle output.txt

12300000;1;001780;000000679326;2;;1989
12300000;1;008823;000000814860;1;;1960
12300000;1;011427;000000843754;1;;1953
12300000;1;011450;000000844009;1;;1954

Nun sollen aber nur die Daten geändert werden, bei denen der Wert in der 4 Spalte (Beispiel: 000000679326) mit einem Wert aus
einer weiteren Tabelle (z.B: bbb.txt) übereinstimmt.

Wie kann ich dies abfragen?

Viele Grüße
Chris
 
Code:
for /f "tokens=1-10 delims=; " %%a in (%txt%) do (
   if "%%d"="000000679326" (
      echo %%a;%%b;%%c;%%d;%%e;;%%g >> %temp%
   )
)

Für komplexere Aufgaben ist batch dann aber auch schon nicht mehr das richtige Werkzeug. Batch is a Bitch. Dann lieber auf PowerShell umsatteln.
 
  • Gefällt mir
Reaktionen: Pyromane1 und Hayda Ministral
Wenn es sich gar nur um eine einmalige Aufgabe handelt, kann man das sogar mit Excel machen...
 
@Chris_999:
Das ist aber eine sehr mangelhafte Beschreibung des Problem. Es fängt schon bei der Beschreibung der Situation an:
Du möchtest nicht nur die rot markierten "000" löschen, sondern auch das ";;" und die 2-stellige Zahl hinter der roten Markierung. Denn das macht deine Batch aktuell.
Und du hast auch nicht explizit geschrieben was passieren soll, wenn der Wert in Spalte 4 nicht in Datei "bbb.txt" gefunden wurde. Soll die Zeile dann unverändert geschrieben werden? Soll sie verworfen werden? Ich vermute letzteres, aber wer weiß...
Und überhaupt, was ist das für ein Wert in Spalte 4? Ist der immer einmalig? Soll die "bbb.txt" irgendwie speziell verarbeitet werden?

Quick & Dirty...
Code:
@ECHO OFF
SET "txt1=aaa.txt"
SET "txt2=bbb.txt"
SET "temp=output.txt"
FOR /F "tokens=1-10 delims=;" %%a IN (%txt1%) DO (
    FIND "%%d" "%txt2%">NUL
    IF NOT ERRORLEVEL 1 ECHO %%a;%%b;%%c;%%d;%%e;;%%g >> %temp%
)
 
Hallo,

erst einmal Danke für Deine Rückantwort, deine Batch und einige Hinweise zur "mangelhaften Beschreibung".

Es handelt sich um eine txt-Datei mit ca. 12.000 Datensätzen und 206 Spalten pro Datensatz.
Diese müssen nicht zwingend gefüllt sein ";;".

Der einfach halber hatte ich nur die Datei gekürzt dargestellt, somit ist die Batch natürlich noch nicht vollständig.

Zur Frage bzgl. der Verarbeitung folgender Hinweis:

Tabelle aaa.txt wird in regelmäßigen Abständen zur Verfügung gestellt. Die Daten in bbb.txt beinhalten Daten aus einem anderen Prozess. Zur weiteren externen Bearbeitung müssen entsprechende Werte aus Tabelle aaa.txt dann gelöscht werden, wenn diese in Tabelle bbb.txt vorkommen.
Das heißt, stimmt der Wert in Spalte 4 in Tabelle aaa.txt mit Tabelle bbb.txt überein, sollen die Werte des entsprechenden Datensätzen gelöscht werden.

Könntest Du deine Batch insoweit ändern, dass alle Datensätze in output.txt geschrieben werden und nur die gefundenen Datensätze aus bbb.txt geändert werden?

Ist es auch möglich die zu änderten Spalte in der Batch sofort anzugeben?
Es betrifft immer die Werte von Spalte 89 - 102.
 
Du willst damit also sagen, dass du/ihr regelmäßig mit 12.000 Datensätzen in einer CSV-Datei arbeitet?!?

ich möchte dringend dazu raten, den Prozess als solchen zu überdenken. 12000 Datensätzen schreien förmlich nach einer Datenbank. Batch mit einer CSV-Datei ist für sowas denkbar ungeeignet. Heute ist es nur Spalte 4, morgen hast du plötzlich weitete Anforderungen und nächste Woche macht die Batch dann die Grätsche.

Woher kommen diese Daten denn? Ich kann mir nicht vorstellen, dass die CSV-Datei selbst die genutzte Datenquelle ist. Das sieht mehr nach einem Export aus, weil CSV vorwiegend nur als Transferformat von A nach B genutzt wird.

Es wäre wohl schlauer, direkt mit einer kleinen Datenbank-Anwendung zu arbeiten. Wenn nicht direkt in der ursprünglichen Anwendung möglich, dann wenigstens als Ersatz für das Batchgefrickel. Zum Beispiel mit C# und einer SQLite Datenbank. Das ist nicht nur schneller und zuverlässiger, sondern auch einfacher zu handhaben, weil Batch schlicht und ergreifend so weit von einer Skript- oder gar Programmiersprache entfernt ist wie das Gebrabbel eines Babys von Hochdeutsch. Batch besteht fast ausschließlich aus Besonderheiten, insbesondere bei Textverarbeitung, Filehandling und Schleifen - also nahezu allen Basisfunktionen einer Skript-/Programmiersprache.
 
  • Gefällt mir
Reaktionen: Pyromane1 und PHuV
Regelmäßig heißt viermal im Jahr. Ja, es ist eine Export-Datei die an einer externen Stelle weiterverarbeitet wird und nein, es gibt keine weiteren Anforderungen ...
Danke für die Hinweise und Vorschläge der besseren Umsetzung.:daumen:

Da Darkman.X bereits einen funktionierenden Lösungsweg im "Batch Gebrabbel" ;) erarbeitet hat, würde ich diesen gerne weiter verfolgen. Vielleicht kann man diese ja noch ausbauen,
 
Werfe beide Dateien in Datenbanken und vergleiche diese dann damit. Sowie die Daten aussehen kommen diese ja bereits aus Datenbanken. Finger weg in solchen Fällen von Batch.
 
Aus der Diskussion über Sinn oder Unsinn halte ich mich raus. Ich werde für diese Tätigkeit nicht bezahlt (im Gegensatz zu "Chriss_999"). Wenn etwas schief geht, dann hat er den Ärger, nicht ich.
Die Anwendung des Codes geschieht auf eigene Gefahr!

Ich weiß immer noch nicht, ob die Werte in Spalte 4 mehrmals (in den 12.000 Zeilen) vorkommen oder ob jeder Wert einmalig ist, eine Art eindeutige ID?
Ich erwähne es, weil in Batch-Zeile 6 wird nur stumpf nach dem Wert von Spalte 4 gesucht. Es wird nicht geprüft ob der gefundene Wert (die Zeile) in Datei "bbb.txt" die passende Zeile zur Ursprungszeile in Datei "aaa.txt" ist.

Auch beachtet werden muss, dass leere Spalten (";;") nicht als Spalten von der FOR-Schleife gelesen werden. Eine Zeile mit "1;2;3;;4;;5" hat für die FOR-Schleife nur 5 Spalten und nicht 7! Das könnte Probleme machen.
Man könnte das umgehen, indem vorher temporär ein Leerzeichen zwischen den ";;" eingebaut wird (geht auch per Batch) und am Ende wieder löscht, aber das wird dann schon etwas umständlicher bzw. es ist für mich in diesem Blindflug zu gefährlich.


Chris_999 schrieb:
[...]Könntest Du deine Batch insoweit ändern, dass alle Datensätze in output.txt geschrieben werden und nur die gefundenen Datensätze aus bbb.txt geändert werden?[...]

Hier die Änderung:
Code:
@ECHO OFF
SET "txt1=aaa.txt"
SET "txt2=bbb.txt"
SET "temp=output.txt"
FOR /F "tokens=1-10 delims=;" %%a IN (%txt1%) DO (
    FIND "%%d" "%txt2%">NUL
    IF NOT ERRORLEVEL 1 (
        ECHO %%a;%%b;%%c;%%d;%%e;;%%g >> %temp%
    ) ELSE (
        ECHO %%a;%%b;%%c;%%d;%%e;%%f;%%g;%%h;;%%i >> %temp%
    )
)



Chris_999 schrieb:
[...]Ist es auch möglich die zu änderten Spalte in der Batch sofort anzugeben?
Es betrifft immer die Werte von Spalte 89 - 102.

Ich verstehe leider nicht, was du möchtest. Oder ich ahne es schon, aber es wird problematisch, was ich schon wegen ";;" erwähnte.
 
  • Gefällt mir
Reaktionen: Raijin
Besten Dank für die Ergänzung!

Es ist wohl doch komplizierter dies in einer Batch abzubilden.
Ist ein Problem gelöst, treten schon die nächsten Probleme/Fragen auf.
Ich werde das dann doch in einer Datenbank erledigen, dies scheint ja sinnvoller zu sein.
 
Sofern die CSV von Excel ordnungsgemäß geöffnet wird, kann man das zur Not auch über diesen Weg machen. Excel-Formeln, die eine Spalte prüfen und dann einen Wert setzen/löschen, sind nu auch keine Raketenwissenschaft. Das ist zwar auch Frickelei, aber wenn man ein wenig mit Excel umgehen kann, ist so eine Änderung binnen 5 Minuten erledigt und wieder als CSV exportiert.

Batch eignet sich eigentlich nur für das banale Nacheinanderausführen von simpelsten Kommandos. Alles was darüber hinausgeht, ist in batch kompliziert und zum Teil auch von hinten durch die Brust ins Auge gelöst.
 
Nur mal so, ich mache sowas sehr oft und tagtäglich auf verschiedenen Systemen automatisiert mit diversen DI-Tools wie Talend und Co., Oracle mit sqlldr und Co. Viele Datenbanken bieten hier Imports und Funktionen im Umgang mit TXT oder CSV-Dateien an. Daher, schauen daß das Format stimmig ist und so bleibt, und dann einfach automatisiert das Ding in ein Verzeichnis hinlegen und importierten lassen. Der Rest der Verarbeitung erfolgt dann über die Datenbank.
 
  • Gefällt mir
Reaktionen: Pyromane1
Zurück
Oben