Filtern beim Kopieren von zwei txt-Dateien
Ausfiltern von Parametern aus zwei txt-Dateien beim Kopieren
Hallo Biber,
ich habe zwei txt-Dateien und will beide Dateien (Obs04711.zut und Obs04711.zu) zusammenkopieren bzw. den Inhalt der zweiten in die erste Datei (Obs04722.zut)wobei bei der zweiten Datei im Inhalt drei gleiche Inhalte (Zeilen) nicht mit übernommen werden sollen.Von diesen Dateien habe ich jeweils über 100 Stück.
1204711
1803
19060406
20046733
211
24K
1204711
1803
19060406
20041220
211
24K
Wie heißt der Syntax unter Win2000/Win98 für das Zusammenkopieren wobei die Zeilen die mit 12XXXXX;18XX;19XXXXXX beginnen , nicht in die erste Datei übernommen werden sollen.Komme als Anfänger mit meinen Kenntnisstand nicht weiter.
Bitte um Hilfe.
Manne
Hallo Biber,
ich habe zwei txt-Dateien und will beide Dateien (Obs04711.zut und Obs04711.zu) zusammenkopieren bzw. den Inhalt der zweiten in die erste Datei (Obs04722.zut)wobei bei der zweiten Datei im Inhalt drei gleiche Inhalte (Zeilen) nicht mit übernommen werden sollen.Von diesen Dateien habe ich jeweils über 100 Stück.
1204711
1803
19060406
20046733
211
24K
1204711
1803
19060406
20041220
211
24K
Wie heißt der Syntax unter Win2000/Win98 für das Zusammenkopieren wobei die Zeilen die mit 12XXXXX;18XX;19XXXXXX beginnen , nicht in die erste Datei übernommen werden sollen.Komme als Anfänger mit meinen Kenntnisstand nicht weiter.
Bitte um Hilfe.
Manne
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 29875
Url: https://administrator.de/contentid/29875
Ausgedruckt am: 26.11.2024 um 07:11 Uhr
16 Kommentare
Neuester Kommentar
Moin Manne,
würde ich so lösen:
In diesem Verzeichnis, in dem die *.zu und *.zut-Dateien sind am CMD-Prompt tippen:
(dieser FindStr-Befehl liefert alle Zeilen, die NICHT mit "12", "18" oder "19" beginnen.)
Wenn das als Kriterium reichen sollte, dann würdest Du ja an eine *zut-Datei diesen verbleibenden Rest aus der *zu-Datei so anhängen:
Oder, für alle 100 *.zu-Dateien gilt dann halt:
...findstr /b /v "12 18 19" [dateiname].zu>>[dateiname].zut
Wenn ich Dich richtig verstanden habe...
Gruß
Biber
P.S. Würde ich erstens mit einer Kopie der Daten versuchen *gg
...und zweitens NICHT per Batch! Sonder lieber einmal per copy & paste...
Wenn die Zeile/der Batch mehrmals gestartet wird, bekommst Du die Dateien ja immer länger, wenn Du die Zweit-Dateien *.zu nicht verschiebst oder löscht.
würde ich so lösen:
In diesem Verzeichnis, in dem die *.zu und *.zut-Dateien sind am CMD-Prompt tippen:
$cmd$findstr /b /v "12 18 19" Obs04711.zu
20041220
211
24K
Wenn das als Kriterium reichen sollte, dann würdest Du ja an eine *zut-Datei diesen verbleibenden Rest aus der *zu-Datei so anhängen:
$cmd$findstr /b /v "12 18 19" Obs04711.zu>>Obs04711.zut
Oder, für alle 100 *.zu-Dateien gilt dann halt:
...findstr /b /v "12 18 19" [dateiname].zu>>[dateiname].zut
$cmd$ for /f %i in ('dir /b *.zu') do findstr /b /v "12 18 19" %i >>%~ni.zut
Wenn ich Dich richtig verstanden habe...
Gruß
Biber
P.S. Würde ich erstens mit einer Kopie der Daten versuchen *gg
...und zweitens NICHT per Batch! Sonder lieber einmal per copy & paste...
Wenn die Zeile/der Batch mehrmals gestartet wird, bekommst Du die Dateien ja immer länger, wenn Du die Zweit-Dateien *.zu nicht verschiebst oder löscht.
Moin Manne,
na, das beruhigt mich doch, das auch dieser Oneliner tat, was er soll..*gg
Antwort auf Deine Frage:
Oben habe ich ja mit dem Findstr-Parameter "/v" alles weggefiltert, was angegeben war - also alle Zeilen genommen, die die Suchkriterien nicht enthalten.
Umgekehrter weg also: OHNE Parameter "/v" bekommst Du nur alle Zeilen, die Dein Suchkriterium enthalten.
Aber diesen Dateien würde ich dann mal eine andere Endung geben oder die in ein anderes Verzeichnis schreiben lassen.
for /f %i in ('dir /b *.zu') do findstr /b "20046733 211 24K" %i >>%~ni.zut_nurZeilenMit
Der Parameter "/b" besagt nur, dass die Suchkriterien am Anfang der Zeile stehen sollen. Wenn das nicht so ist, musst Du den weglassen.
Siehe "FindStr /?" am CMD-Prompt oder in der M$-Hilfe.
Gruß
Biber
na, das beruhigt mich doch, das auch dieser Oneliner tat, was er soll..*gg
Antwort auf Deine Frage:
Oben habe ich ja mit dem Findstr-Parameter "/v" alles weggefiltert, was angegeben war - also alle Zeilen genommen, die die Suchkriterien nicht enthalten.
Umgekehrter weg also: OHNE Parameter "/v" bekommst Du nur alle Zeilen, die Dein Suchkriterium enthalten.
Aber diesen Dateien würde ich dann mal eine andere Endung geben oder die in ein anderes Verzeichnis schreiben lassen.
for /f %i in ('dir /b *.zu') do findstr /b "20046733 211 24K" %i >>%~ni.zut_nurZeilenMit
Der Parameter "/b" besagt nur, dass die Suchkriterien am Anfang der Zeile stehen sollen. Wenn das nicht so ist, musst Du den weglassen.
Siehe "FindStr /?" am CMD-Prompt oder in der M$-Hilfe.
Gruß
Biber
Och, das ist unwahrscheinlich, das es das letzte Mal sein wird
Hm, ich habs eben noch mal mit einer Beispiel angetestet.. der FindStr-Befehl scheint auch ein paar der versteckten M$-Features zu haben.
Teste bitte erstmal den FindStr-Teil an einer Datei, bis das Ergebnis passt. Wenn es nicht klappt, dann bitte eine PN mit Deiner Mailadresse an mich, dann schau ich mir das mal mit ein, zwei "echten" *.zu-Dateien von Dir an.
So, jetzt is' Mittach...
Grüße
Biber
Hm, ich habs eben noch mal mit einer Beispiel angetestet.. der FindStr-Befehl scheint auch ein paar der versteckten M$-Features zu haben.
>type test.zu
1204711
1803
19060406
20046733
211
24K
> findstr /b "120* 18* 19* 20014339 211 24K" test.zu
1204711
1803
19060406
211
24K
(=12:00:17 F:\=)
> findstr /b "120 18 19 20014339 211 24K" test.zu
1204711
1803
19060406
211
------------------------>??? nanu, hier fehlt "24K"????
Teste bitte erstmal den FindStr-Teil an einer Datei, bis das Ergebnis passt. Wenn es nicht klappt, dann bitte eine PN mit Deiner Mailadresse an mich, dann schau ich mir das mal mit ein, zwei "echten" *.zu-Dateien von Dir an.
So, jetzt is' Mittach...
Grüße
Biber
Ah, ich glaube, ich verstehe jetzt das Ziel.. sorry hab ein bisschen länger gebraucht.
Un sicherzugehen: Gemeint ist
Datei Vorher: *.zu
Der Inhalt der ZU-Datei:
1204502
1804
19040406
20014339
211
24K
20014342
211
24K
20014334
211
24K
20017618
211
24K
20016182
211
24K
20010557
211
24K
Datei NACHHER: *.zut
Der Inhalt der ZU-Datei:
1204502
1804
19040406
20014339
211 (einmal)
24K (einmal)
20014342
20014334
20017618
20016182
20010557
... und die 209143xx sind alle unterschiedlich? Oder können da auch Duplikate kommen?
Oder gibt es da noch andere Kriterien, nach denen rausgefiltert wird?
Mit "bestimmte" ist gemeint "alle, aber nur einmalig aufgeführt"?
Rückfragend
Biber
Un sicherzugehen: Gemeint ist
Datei Vorher: *.zu
Der Inhalt der ZU-Datei:
1204502
1804
19040406
20014339
211
24K
20014342
211
24K
20014334
211
24K
20017618
211
24K
20016182
211
24K
20010557
211
24K
Datei NACHHER: *.zut
Der Inhalt der ZU-Datei:
1204502
1804
19040406
20014339
211 (einmal)
24K (einmal)
20014342
20014334
20017618
20016182
20010557
... und die 209143xx sind alle unterschiedlich? Oder können da auch Duplikate kommen?
Oder gibt es da noch andere Kriterien, nach denen rausgefiltert wird?
.. eine Datei, die mehrere 20XXXXXX,21X,24X enthält,
aber ich im Onliner nur bestimmte 20XXXXXX,21X,24X ...haben will..
aber ich im Onliner nur bestimmte 20XXXXXX,21X,24X ...haben will..
Mit "bestimmte" ist gemeint "alle, aber nur einmalig aufgeführt"?
Rückfragend
Biber
Okay... dann ist natürlich eine andere Verarbeitung nötig als das Übernehmen "aller Zeilen mit xxx" oder "aller Zeilen ohne yyy"..
Dann ist es sinnvoller, die *.zu zeilenweise abzuarbeiten mit einem FOR /F-Konstrukt.
Zwei Fragen noch dazu:
1) ist es "immer" eine blockweise Sequenz - 200xxxxxx gefolgt von 2 weiteren Zeilen, bevor der nächste Block beginnt?
2) wenn mehrere "Blöcke" in die *.zut-Datei zu übernehmen sind, ist das von außen, am Dateinamen der *.zu-Datei erkennbar?
Oder musst Du das bei jeder Datei einzeln entscheiden?
Oder gilt immer für alle 100 Dateien "Ubernimm die "12* 18* 19*"-er am Anfang und danach den Block "200143333 21* 24" sowie den Block "2001466666 21* 24*" ?
Gruß Biber
Dann ist es sinnvoller, die *.zu zeilenweise abzuarbeiten mit einem FOR /F-Konstrukt.
Zwei Fragen noch dazu:
1) ist es "immer" eine blockweise Sequenz - 200xxxxxx gefolgt von 2 weiteren Zeilen, bevor der nächste Block beginnt?
2) wenn mehrere "Blöcke" in die *.zut-Datei zu übernehmen sind, ist das von außen, am Dateinamen der *.zu-Datei erkennbar?
Oder musst Du das bei jeder Datei einzeln entscheiden?
Oder gilt immer für alle 100 Dateien "Ubernimm die "12* 18* 19*"-er am Anfang und danach den Block "200143333 21* 24" sowie den Block "2001466666 21* 24*" ?
Gruß Biber
Moin ManneKL,
ich habe mal eine Skizze für eine zeilenweise Datei-Verarbeitung zusammengeschreddert.
Ist leider kein Oneliner mehr
Ergebnis am CMD-Prompt:
Hoffe, Du kannst es verwerten.
Gruß Biber
ich habe mal eine Skizze für eine zeilenweise Datei-Verarbeitung zusammengeschreddert.
Ist leider kein Oneliner mehr
::--snipp AddZuBlock.bat
:: Parameter 1: *.zu-Datei.
:: Parameter 2: Block, der angefügt werden soll. Erster passender wird genommen.
:: -- Beispiel 1) AddZuBlock test.zu 20014334
:: --> test.zut existiert noch nicht
:: --> erzeugt test.zut mit Header+Block 20014334
:: -- Beispiel 2) AddZuBlock test.zu 20016182 20021010 20021011 20021012
:: --> test.zut existiert
:: --> fügt Blöcke 20016182, 20021010, 20021011, 20021012 an test.zut an.
:: Eine gleichnamige Zieldatei mit der Endung *.zut wird mit den Kopfdaten (3Zeilen) angelegt,
:: falls noch nicht vorhanden. Falls schon vorhanden, wird der angegebene Block in Para2 angefügt.
@echo off
if [%1]== (echo Keine Quelldatei angegeben!) && goto :eof
If not exist "%~1" (echo Quelldatei "%~1" nicht gefunden!) && goto :eof
SetLocal enableDelayedExpansion
(Set "quell=%~1") & Set "ziel=%~dpn1.zut"
Set /p Header=<%quell%
If not exist %ziel% call :WriteBlock %Header%
if [%2] == goto :eof
For %%z in (%2 %3 %4 %5 %6 %7 %8 %9) do call :WriteBlock %%z
goto :eof
:WriteBlock optPara1=BlockID
Set /a line=0
Set found=No
Echo Soll schreiben.. Block %1... in %ziel%
For /F %%a in (%quell%) do If !line! LSS 3 (
If [%%a]==[%1] set "found=Ja"
If [!found!]==[Ja] (
echo Schreibe [%%a]...
echo %%a>>%ziel%
Set /a line=!line!+1
))
goto :eof
:: -- snapp AddZuBlock.bat
Ergebnis am CMD-Prompt:
-------die QuellDatei:
$cmd$type test.zu
1204502
1804
19040406
20014339
211
24K
20014342
211
24K
20014334
211
24K
20017618
211
24K
20016182
211
24K
20010557
211
24K
$cmd$addzublock test.zu 20016182 20014334
Soll schreiben.. Block 1204502... in Z:\test.zut
Schreibe [1204502]...
Schreibe [1804]...
Schreibe [19040406]...
Soll schreiben.. Block 20016182... in Z:\test.zut
Schreibe [20016182]...
Schreibe [211]...
Schreibe [24K]...
Soll schreiben.. Block 20014334... in Z:\test.zut
Schreibe [20014334]...
Schreibe [211]...
Schreibe [24K]...
(Ergebis Zieldatei)
$cmd$type test.zut
1204502
1804
19040406
20016182
211
24K
20014334
211
24K
Hoffe, Du kannst es verwerten.
Gruß Biber