alle zeilen mit bestimmten informationen aus einer text datei filtern
zeilen mit bestimmten infos in einer txt finden und in eine neue txt eeinfügen
Nehmen wir an, ich habe eine datei mit 200000 zeilen.
einen sehr langen kontoauszug von paypal beispielsweise.
in jeder zeile stehen informationen wie verwendungszweck, absenderemail, betrag, empfängeremail (falls mehrere emailadressen auf einen account verlinkt sind).
diese daten stehen pro überweisung in einer zeile hintereinander, wahlweise durch ; oder {tabstop} getrennt.
nun möchte ich aus dieser datei mit einer batchdatei zum Beispiel alle absenderemailadressen derer, die einen betrag von 1€ mit dem verwendungszweck Spende an die emailadresse spendenkonto1@fff.ff herausfiltern um diesen leuten dann eine danksagung zukommen zu lassen. wenn ich die emailadressen habe, kann ich ja bcc benutzen um alle zu erreichen.
dazu möchte ich erst aus dem kontoauszug alle zeilen mit diesen kriterien filtern und darüber dann eine batch laufen lasssen die alle emailadressen aufschreibt die ungleich der empfängeremailadresse sind.
ganz einfach also. ich nehme an, das kann man mit find machen, allerdings habe ich noch nichts näheres dazu gefunden.
ich hoffe ihr könnt mir helfen.
Nehmen wir an, ich habe eine datei mit 200000 zeilen.
einen sehr langen kontoauszug von paypal beispielsweise.
in jeder zeile stehen informationen wie verwendungszweck, absenderemail, betrag, empfängeremail (falls mehrere emailadressen auf einen account verlinkt sind).
diese daten stehen pro überweisung in einer zeile hintereinander, wahlweise durch ; oder {tabstop} getrennt.
nun möchte ich aus dieser datei mit einer batchdatei zum Beispiel alle absenderemailadressen derer, die einen betrag von 1€ mit dem verwendungszweck Spende an die emailadresse spendenkonto1@fff.ff herausfiltern um diesen leuten dann eine danksagung zukommen zu lassen. wenn ich die emailadressen habe, kann ich ja bcc benutzen um alle zu erreichen.
dazu möchte ich erst aus dem kontoauszug alle zeilen mit diesen kriterien filtern und darüber dann eine batch laufen lasssen die alle emailadressen aufschreibt die ungleich der empfängeremailadresse sind.
ganz einfach also. ich nehme an, das kann man mit find machen, allerdings habe ich noch nichts näheres dazu gefunden.
ich hoffe ihr könnt mir helfen.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 50429
Url: https://administrator.de/contentid/50429
Ausgedruckt am: 13.11.2024 um 00:11 Uhr
22 Kommentare
Neuester Kommentar
Hallo rumpelstielzchen987!
Bleiben wir noch bei den einfachen Sachen
Mehrfaches Ausfiltern könntest Du über eine Kette machen:
Die entstehenden Zwischendateien lassen sich, wenn nicht mehr benötigt (etwa zu Debug-Zwecken), per "del KurzeListe*.txt" rückstandslos entsorgen.
Grüße
bastla
Bleiben wir noch bei den einfachen Sachen
Mehrfaches Ausfiltern könntest Du über eine Kette machen:
find /i "spendenkonto1@fff.ff" < "LangeListe.txt" > "KurzeListe1.txt"
find /i "1 EUR" < "KurzeListe1.txt" > "KurzeListe2.txt"
find /i "spende" < "KurzeListe2.txt" > "Fertig.txt"
Grüße
bastla
wie kann ich daraus jetzt alle emailadressen herausfiltern, in eine datei schreiben
alle zeilen mit bestimmten informationen aus einer text datei filternund meine emailadresse daraus löschen?
find /v /i "meinemail@abc.ef" < "Adressliste.txt" > "NurAndereAdressen.txt"
Grüße
bastla
[Edit] Zusatzanforderung ("ich möchte das auch hinbekommen wenn ...") beim Erstellen dieses Kommentars noch nicht vorhanden. [/Edit]
Hallo rumpelstielzchen987!
"find" und "findstr" sind grundsätzlich zeilenorientiert.
Wenn Du gesteigerten Wert auf Umwege legst, versuch mit geschachtelten "for /f"-Schleifen die einzelnen Zeilen und darin die einzelnen Wörter abzuhandeln, die "echo"-Ausgabe des Wortes mit "| find ......" zu filtern und bei "errorlevel 0" bzw unter Verwendung von "&&" in eine Datei zu schreiben.
Viel Spaß
bastla
"find" und "findstr" sind grundsätzlich zeilenorientiert.
Wenn Du gesteigerten Wert auf Umwege legst, versuch mit geschachtelten "for /f"-Schleifen die einzelnen Zeilen und darin die einzelnen Wörter abzuhandeln, die "echo"-Ausgabe des Wortes mit "| find ......" zu filtern und bei "errorlevel 0" bzw unter Verwendung von "&&" in eine Datei zu schreiben.
Viel Spaß
bastla
Hallo rumpelstielzchen987!
"tokens" sind die Bestandteile (auch eine Bezeichnung als "Felder" wäre durchaus gerechtfertigt) einer (Daten-)Zeile, getrennt durch "delimiter".
Laut Deinem oben dargestellten Satzaufbau, den ich so verstanden habe:
was wiederum nur bedeutet:
Gehe alle Zeilen der Datei "Fertig.txt" (oder bei Dir "Datei3.txt") durch und übernehme in die Variable %i aus jeder Zeile nur den Eintrag nach dem ersten ";" (Token Nr. 2). Schreib schleßlich den Inhalt der Variablen %i in die Datei "Adressliste.txt" (jede Adresse in eine eigene Zeile).
Die enthaltene "type"-Anweisung sorgt für die Ausgabe des Dateiinhaltes, damit die Schleife die einzelnen Zeilen überhaupt erhält. Bei einem einfachen Dateinamen wie "Datei3.txt" wäre es nicht erforderlich - Du könntest auch gleich den Dateinamen ohne Anführungszeichen in die Klammer schreiben, was aber bei Namen mit Leerzeichen zu Problemen führt - daher verwende ich gewohnheitsmäßig die "type"-Schreibweise. Die ' dienen zur Kennzeichnung des dazwischen stehenden Textes als Befehl, der zunächst auszuführen ist und dessen Ausgabe dann an die Schleife übergeben wird - daher könntest Du zB auch an der Kommandozeile ein type "Datei3.txt" eingeben und würdest die Ausgabe dann eben auf den Bildschirm erhalten.
Grüße
bastla
[Edit] Freut mich, dass Du selbst schon das Wesentliche gefunden hast. [/Edit]
[Edit2] Hatte ich da wirklich die ganze Zeit nur ein ">" vor "Adressliste.txt"? Obwohl, den Platz für's Zweite hatte ich ja frei gelassen ... [/Edit2]
"tokens" sind die Bestandteile (auch eine Bezeichnung als "Felder" wäre durchaus gerechtfertigt) einer (Daten-)Zeile, getrennt durch "delimiter".
Laut Deinem oben dargestellten Satzaufbau, den ich so verstanden habe:
Empfängeradresse;Absenderadresse;Zahlungsbetrag;Verwendungszweck
wäre die Mailadresse des Absenders der 2. Bestandteil Deiner Datenzeile, wobei als Trennzeichen ein ";" verwendet wird - darum die Schreibweisefor /f "tokens=2 delims=;" %i in ('type "Fertig.txt"') do echo %i>> "Adressliste.txt"
Gehe alle Zeilen der Datei "Fertig.txt" (oder bei Dir "Datei3.txt") durch und übernehme in die Variable %i aus jeder Zeile nur den Eintrag nach dem ersten ";" (Token Nr. 2). Schreib schleßlich den Inhalt der Variablen %i in die Datei "Adressliste.txt" (jede Adresse in eine eigene Zeile).
Die enthaltene "type"-Anweisung sorgt für die Ausgabe des Dateiinhaltes, damit die Schleife die einzelnen Zeilen überhaupt erhält. Bei einem einfachen Dateinamen wie "Datei3.txt" wäre es nicht erforderlich - Du könntest auch gleich den Dateinamen ohne Anführungszeichen in die Klammer schreiben, was aber bei Namen mit Leerzeichen zu Problemen führt - daher verwende ich gewohnheitsmäßig die "type"-Schreibweise. Die ' dienen zur Kennzeichnung des dazwischen stehenden Textes als Befehl, der zunächst auszuführen ist und dessen Ausgabe dann an die Schleife übergeben wird - daher könntest Du zB auch an der Kommandozeile ein type "Datei3.txt" eingeben und würdest die Ausgabe dann eben auf den Bildschirm erhalten.
Grüße
bastla
[Edit] Freut mich, dass Du selbst schon das Wesentliche gefunden hast. [/Edit]
[Edit2] Hatte ich da wirklich die ganze Zeit nur ein ">" vor "Adressliste.txt"? Obwohl, den Platz für's Zweite hatte ich ja frei gelassen ... [/Edit2]
Moin ihr beiden nochmal,
wikipedia hin, Doktorarbeiten her... ich versuche es mal lieber mit einem banalen Beispiel.
Angenommen, ich hätte mir ausdem Gesülze der wissentschaftlichen Abhandlung oben ein paar Zeilen rauskopiert mit Copy&Paste in eine Datei ForBeispiel.txt, an zwei zufälligen Stellen eine Mailadresse reingestreut und diese Datei bei mir im aktuellen Verzeichnis abgespeichert:
...dann würde folgender unelegant am CMD-Prompt runtergetippselte Befehl das Ergebnis unten bringen:
Übersetzt: in der linken FOR-Anweisung sage ich:
[Bei For-Anweisungen zuerst das in der Klammer lesen und verstehen]
- Nimm alle Zeilen, die Findstr auf der Suche nach dem Zeichen "@" in der Datei ForBeispiel.txt übrig lässt (==findet)...
-diese Zeile fasse als 26 einzelne Tokens (in etwa: Worte) auf ..Token1 wird rechts der For-Anweisung %a heißen, Token2 = %b etc...
- Diese 26 Tokens von %a bis %z also übergebe ich einzeln in der zweiten FOR-Anweisung nacheinander an den Befehl @echo <dasEinzelneToken>|find "@"
- oder übersetzt, jedes "Wort", dass ein "@" enthält, wird "durchgelassen" bzw angezeigt.
Wenn Du also noch ein ">>alleMeineMailAddys.txt" dahinterhängst, dann bist Du halb fertig.
Das sollte in etwa das sein, was bastla oben mit "abzuhandeln, die "echo"-Ausgabe des Wortes mit "| find ......" zu filtern und bei "errorlevel .." gemeint hat.
Gruss Biber
[Sollte nur als Crashkurs zur FOR-Anweisung dienen, nicht als Gesamtlösung]
wikipedia hin, Doktorarbeiten her... ich versuche es mal lieber mit einem banalen Beispiel.
Angenommen, ich hätte mir aus
::---datei ForBeispiel.txt
komplexerer Sprachen empfiehlt es sich aber, die Eingabe in einer Zwischenstufe als Kette von komplexeren
Token zu betrachten. Dazu fasst ein vorgeschalteter Lexer biber@bremen.de die Zeichen der Eingabe zu handlichen
"Häppchen", eben den komplexeren Token, zusammen. Dabei wird jedem Token ein "Typ" zugewiesen, der dann mit
den Terminalsymbolen der Grammatik verglichen werden kann.
Zum Beispiel könnte "123" (Folge von mehreren Zeichen) zu dem Token "Zahl:123"
(ein einzelnes Token) werden, "foobar" zu "id:foobar" @biber@vi$$$tafanss.vu whatever
...dann würde folgender unelegant am CMD-Prompt runtergetippselte Befehl das Ergebnis unten bringen:
>for /f "tokens=1-26" %a in ('findstr "@" ForBeispiel.txt') do @for %I in (%a %b %c %d %e %f %g %h %i %k %l %m %n ) do @echo I|find "@"
biber@bremen.de
@biber@vi$$$tafanss.vu
Übersetzt: in der linken FOR-Anweisung sage ich:
[Bei For-Anweisungen zuerst das in der Klammer lesen und verstehen]
- Nimm alle Zeilen, die Findstr auf der Suche nach dem Zeichen "@" in der Datei ForBeispiel.txt übrig lässt (==findet)...
-diese Zeile fasse als 26 einzelne Tokens (in etwa: Worte) auf ..Token1 wird rechts der For-Anweisung %a heißen, Token2 = %b etc...
- Diese 26 Tokens von %a bis %z also übergebe ich einzeln in der zweiten FOR-Anweisung nacheinander an den Befehl @echo <dasEinzelneToken>|find "@"
- oder übersetzt, jedes "Wort", dass ein "@" enthält, wird "durchgelassen" bzw angezeigt.
Wenn Du also noch ein ">>alleMeineMailAddys.txt" dahinterhängst, dann bist Du halb fertig.
Das sollte in etwa das sein, was bastla oben mit "abzuhandeln, die "echo"-Ausgabe des Wortes mit "| find ......" zu filtern und bei "errorlevel .." gemeint hat.
Gruss Biber
[Sollte nur als Crashkurs zur FOR-Anweisung dienen, nicht als Gesamtlösung]
do echo %%i > "a.txt"
...macht eigentlich keinen Unterschied.Aber: gewöhne es Dir zumindest bei einem M$-CMD-Interpreter ab, zu viele Leerzeichen zur Erhöhung der Lesbarkeit zwischen "Tokens" (die kennst Du ja jetzt) zu lassen.
Beispiel:
do echo %%i > "a.txt"
--->nach dem %%i, das geECHOt wird, befindet sich ein Leerzeichen, natürlich auch in der Zieldatei
So ist kein Leerziechen am Ende:
do echo %%i> "a.txt"
Kann beim späteren Suchen und Vergleichen durchaus relevant sein.
Außerdem: niemand sollte M$'s Intelligenz und Streben nach Robustheit überschätzen.
Du kannst zwar (am CMD-Prompt) schreiben:
machirgendwas > " dateiname.xyz " [" dateiname.xyz " hat jeweils ein Leerzeichen am Anfang und amm Ende innerhalb der Anführungszeichen]..
...ich weiß aber aus sicherer Quelle, dass einige von M$ mit ausgelieferte Tools in der Tat dann eine Datei mit führendem Leerzeichen anlegen.
Ist ein bisschen mühsam, diese Datei anzusprechen...
Gruß
Biber
Hallo rumpelstielzchen987!
Da bin ich auch nochmal, weil - die Umleitung in die jeweilige Textdatei mit zB "echo %%i> a.txt" wird Dich nicht froh machen (hatte natürlich ich selbst verbrochen und war mir die ganze Zeit über nicht aufgefallen ).
Ändere daher bitte diese Umleitung auf die eigentlich gewünschte Schreibweise ">>", um an die vorhandene Datei eine neue Zeile anzufügen und nicht, wie bei ">", jedesmal die Datei neu zu erstellen (mit daher eher dürftigem Inhalt am Ende).
Sorry
bastla
Da bin ich auch nochmal, weil - die Umleitung in die jeweilige Textdatei mit zB "echo %%i> a.txt" wird Dich nicht froh machen (hatte natürlich ich selbst verbrochen und war mir die ganze Zeit über nicht aufgefallen ).
Ändere daher bitte diese Umleitung auf die eigentlich gewünschte Schreibweise ">>", um an die vorhandene Datei eine neue Zeile anzufügen und nicht, wie bei ">", jedesmal die Datei neu zu erstellen (mit daher eher dürftigem Inhalt am Ende).
Sorry
bastla
... nur in anführungszeichen geschriebenwerden muss, falls der dateiname ein leerzeichen enthält.
Stimmt - wobei es aber in den allermeisten Fällen (eine Ausnahme hat Biber an anderer Stelle beschrieben, finde ich aber jetzt nicht auf die Schnelle) kein Problem ist, die Anführungszeichen trozdem zu verwenden.Grüße
bastla