mannekl
Goto Top

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

Content-Key: 29875

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

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

Member: Biber
Biber Apr 06, 2006 at 18:02:27 (UTC)
Goto Top
Moin Manne,

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
(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:
$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.
Member: miniversum
miniversum Apr 06, 2006 at 18:11:44 (UTC)
Goto Top
Oh Frank das hätte ja glat zu dem Posting von neulich gepasst.....
Ich könnte ja imernoch nur meine lösung in Drei Schritten anbieten von neulich.

miniversum
Member: Biber
Biber Apr 06, 2006 at 18:20:58 (UTC)
Goto Top
@miniversum

Dafür brauche ich aber immer 30 Zeilen zum Erklären meiner einen CMD-Zeile.. face-wink
Member: ManneKL
ManneKL Apr 07, 2006 at 14:33:30 (UTC)
Goto Top
Hallo Biber,

wenn ich auf CMD-Promt diese Befehle audführe , dann habe ich in der .ZUT-Datei eine Fehlermeldung>>"Das System kann die angegebene Datei nicht finden".Obwohl diese im selben Ordner sich befindet.
Das Auslesen im CMD_Promt mit findstr klappt, aber das Kopieren der ausgelesenen Daten ind die .ZUT habe ich noch nicht kapiert!! Bitte Biber,ich brauche nochmal Deine Hilfe damit ich als "Greenhorn" weiterkomme. Will alles in einer .bat-Datei ausführen.
Gruss
Manne
Member: ManneKL
ManneKL Apr 12, 2006 at 07:25:14 (UTC)
Goto Top
Hallo Biber,
vielen dank für die wirkungsvolle Lösung.
Sie hat auf cmd-problemlos funktioniert,entgegen meiner Vorantwort.
Habe aber noch eine Bitte.
Wie ist der Syntax, wenn ich aus mehreren *.zu-Dateinen bestimmte Parameter/Zeilen (z.Bsp:20046733,211,24K)ausfiltern und in eine neue *.zut-Datei übernehmen will?Es sool also eine neue *.zut-Datei mit nur diesen Parametern erstellt werden.
Hochachtungsvoll und mit Respekt für die Hilfe im vorraus
Manne
Member: Biber
Biber Apr 12, 2006 at 07:41:21 (UTC)
Goto Top
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
Member: ManneKL
ManneKL Apr 12, 2006 at 09:42:50 (UTC)
Goto Top
Hallo Biber,
habe noch eine Fragestellung dazu, da meine Experimente mich nicht weiterbringen, trotz der Erklärungen im CMD-Promt.
Ich möchte dass nur die Zeilen mit 20046733, 211,24K in die neue Datei übernommen werden.Alle anderen Zeilen mit 20*,21*,24* soll er ignorieren.Mein Versuch bringt auch alle anderen 20*,21*,24*-Zeilen mit in die neue Datei angehängt werden.Daß will ich nicht.Weiterhin soll er noch die Zeilen-12XXXXX,18XX,18XXXXXX in die neue Datei übernommen werden sollen.
Meine Weiterführung: for /f %i in ('dir /b *.zu') do findstr /b "120. 18. 19. 20014339 211 24K" %i >>%~ni.zut_nurZeilenMit

Bitte noch ein letztes mal Deiner Hilfestellung.
Gruß
Manne
Member: Biber
Biber Apr 12, 2006 at 10:07:48 (UTC)
Goto Top
Och, das ist unwahrscheinlich, das es das letzte Mal sein wird face-wink

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
Member: ManneKL
ManneKL Apr 13, 2006 at 04:29:31 (UTC)
Goto Top
Hallo Biber,
meine Versuche bringen die richtige Übernahme in eine neue Datei, aber dabei werden die anderen Zeilen mit 21X und 24K angehängt , was nicht sein soll.Wenn so eine Datei, die mehrere 19XXXXXX,21X,24X enthält, aber ich im Onliner nur bestimmte 19XXXXXX,21X,24X in die neue Datei haben will.Zuzüglich einmal der Zeilen mit 12XXXXX,18XX,19XXXXXX.


Hochachtungsvoll
Manne
Member: ManneKL
ManneKL Apr 13, 2006 at 09:12:01 (UTC)
Goto Top
Hallo Biber,
meine Versuche bringen die Übernahme in eine neue Datei, aber dabei werden die anderen Zeilen mit 21X und 24K angehängt , was nicht sein soll.Anbei eine Datei, die mehrere 20XXXXXX,21X,24X enthält, aber ich im Onliner nur bestimmte 20XXXXXX,21X,24X in die neue Datei haben will.Zuzüglich einmal der Zeilen mit 12XXXXX,18XX,19XXXXXX.
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


Hochachtungsvoll
Manne
Member: Biber
Biber Apr 13, 2006 at 10:13:38 (UTC)
Goto Top
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?
.. eine Datei, die mehrere 20XXXXXX,21X,24X enthält,
aber ich im Onliner nur bestimmte 20XXXXXX,21X,24X ...haben will..

Mit "bestimmte" ist gemeint "alle, aber nur einmalig aufgeführt"?

Rückfragend
Biber
Member: ManneKL
ManneKL Apr 13, 2006 at 11:48:29 (UTC)
Goto Top
Hallo Biber,

gemeint ist in der neuen Datei:
1204502
1804
19040406

20014339 (einmal)
211 (einmal)
24K (einmal)
20014342 (nicht übernommen werden)
20014334 (nicht übernommen werden)
20017618 (nicht übernommen werden)
20016182 (nicht übernommen werden)
20010557 (nicht übernommen werden)

oder noch ein zweiter Block zusätzlich:

20XXXXXX
21X
24X

mal sehen.
Danke ertmal Biber.
Vielleich hast Du noch n'e Lösung.
Manne
Member: Biber
Biber Apr 13, 2006 at 12:05:53 (UTC)
Goto Top
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
Member: ManneKL
ManneKL Apr 13, 2006 at 12:15:35 (UTC)
Goto Top
...also zu
1. es sind in jeder eintelnen Datei diese blockweisen Sequenzen (200XXXXXX,21X,24K),dann beginnt darunter der nächste Block (200XXXXXX,21X,24K).

2. es ist von außen nicht zu erkennen, sonder per Editor in einer Datei, da alle 100 Dateien diese 3-er Blöcke beinhalten.

3. Als Zusatz wär auch eine Varinate gut, wenn mann einzelne 3-er Blöcke (200XXXXXX,21X,24K)vorher definieren könnte und 1204502 1804 19040406.

Gruß
Manne
.
Member: Biber
Biber Apr 14, 2006 at 13:49:07 (UTC)
Goto Top
Moin ManneKL,

ich habe mal eine Skizze für eine zeilenweise Datei-Verarbeitung zusammengeschreddert.

Ist leider kein Oneliner mehr face-sad
::--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
Member: ManneKL
ManneKL May 24, 2006 at 04:28:57 (UTC)
Goto Top
Hallo Biber,

vielen herzliche Dank für Deine Lösung.
Sie funktioniert und habe sie weiterverarbeitet....

Also, Danke
ManneKL