smileyman
Goto Top

Doppelte Einträge in einer TXT in andere Datei ausfiltern

Hallo Batch-Profis,
ich bräucht mal eure Unterstützung beim Filtern auf Dubletten in einem Text-File.

Ich habe ein TXT-File mit folgendem Muster:

Max Muster, +49 1234 4567, Teststraße 1, 12345 Teststadt
Martin User, +49 122 3342, Feldstraße 5, 55454 Dorf
Test User; +49 1234 6667; Teststraße 4, 12345 Teststadt
Ingo User, +49 1234 4567, Teststraße 1, 12345 Teststadt
Klaus User, +49 122 3342, Hauptstraße 3, 55454 Dorf
Max Benutzer, +49 122 3342, Dorfstrßae 2, 55454 Dorf


Als Ziel bräuchte ich ein File, dass nur die Zeilen enthält, deren Telefonnnummern mehrfach vorkommen:

Max Muster, +49 1234 4567, Teststraße 1, 12345 Teststadt
Ingo User, +49 1234 4567, Teststraße 1, 12345 Teststadt
---
Martin User, +49 122 3342, Feldstraße 5, 55454 Dorf
Klaus User, +49 122 3342, Hauptstraße 3, 55454 Dorf
Max Benutzer, +49 122 3342, Dorfstrßae 2, 55454 Dorf

Ich beiße mir daran gerade die Zähne aus. - Geschafft hätte ich es bereits, die Datei zu bereinigen, dass die doppelten Einträge rausfallen. Jetzt könne ich zwar die beiden Dateien vergleichen - aber es geht doch sicherlich optimaler? - Am optimalsten wäre eine Trennung (---) zwischen den doppelten Einträgen.

Für einen Tipp wäre ich euch sehr dankbar.

smileyman

Content-ID: 143446

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

Ausgedruckt am: 26.11.2024 um 05:11 Uhr

bastla
bastla 24.05.2010 um 23:17:38 Uhr
Goto Top
Hallo smileyman!

Versuch es mal so:
@echo off & setlocal
set "Liste=D:\Tel-Liste.txt"  
set "Ergebnis=D:\Dubletten.txt"  

copy nul "%Ergebnis%">nul  
set "First=True"  
for /f "usebackq tokens=2 delims=," %%i in ("%Liste%") do (  
    findstr /c:"%%i," "%Ergebnis%">nul||(  
        for /f %%a in ('find /c "%%i,"^<"%Liste%"') do if %%a gtr 1 (  
            if not defined First >>"%Ergebnis%" echo ---  
            set "First="  
            findstr /c:"%%i," "%Liste%">>"%Ergebnis%"  
        )
    )
)
Anmerkung: Gesucht wird nach der Nummer und einem unmittelbar folgenden Komma (lt Beispiel) - damit soll vermieden werden, dass "+49 1234 4567" und "+49 1234 45678" als gleiche Nummern betrachtet werden.

Grüße
bastla
77559
77559 25.05.2010 um 08:51:47 Uhr
Goto Top
Bravo bastla!

Ganz schön tricky, hat etwas gedauert den zu verstehen.

Hoffentlich sind die Nummern in ihrer Schreibweise auch identisch,
keine Klammern, Minus- oder Leerzeichen an unterschiedlichen Stellen.

Gruß
LotPings
bastla
bastla 25.05.2010 um 11:36:18 Uhr
Goto Top
Hallo LotPings!
Ganz schön tricky, hat etwas gedauert den zu verstehen.
Ich hab' ja auch keinen Platz für Kommentare verschwendet ... face-wink

Hoffentlich sind die Nummern in ihrer Schreibweise auch identisch
Wäre anderenfalls ja auch keine vernünftige Grundlage für eine automatisierte Verarbeitung - aber schaun mer mal ...

Grüße
bastla
smileyman
smileyman 25.05.2010 um 22:44:33 Uhr
Goto Top
Hallo Bastla,

\'bravo\' - ja, das ist hier das zutreffende Wort.

Habe eben mal versucht, dein Script nachzuvollziehen - Es hat bei mir einige Zeit gedauert, aber jetzt habe ich es zumindest einigermaßen begriffen.
Einzig die copy-Zeile habe ich rausgenommen, damit im Falle des Falles gar keine Datei entsteht. So kann ich später prüfen, ob ein Dubletten-File vorhanden ist und dieses ggf. via Blat per Mail versenden.

Achso, wegen der Nummern: Keine Sorge, die sind wirklich so einheitlich formatiert: Es handelt sich hier um LDAP-Einträge für einen Faxserver. Da der Faxserver jedoch Probleme mit einer doppelten Vergabe hat und das Fax dann gar nicht zustellt, versuche ich das jetzt so abzucanceln: Regelmäßiger LDAP-Export, dein Script drüberjagen, bei vorhandener Dubletten.txt diese an den Administrator mailen und um Bereinigung bitten. OK, klar man könnte hier jetzt noch versuchen Fehleingaben abzufangen und diese mit auszugeben, aber das wäre wohl schon die Profilösung. face-wink
Ich glaube ich muss doch wieder mehr mit Batch machen. - Wenn man dir so zuschaut, macht das einfach Spaß face-wink

Danke für deine Unterstützung.

smileyman
bastla
bastla 25.05.2010 um 23:04:44 Uhr
Goto Top
Hallo smileyman!

Danke für die Blumen ... face-smile

... und sorry wegen der "spärlichen" Kommentierung. face-wink
Einzig die copy-Zeile habe ich rausgenommen, damit im Falle des Falles gar keine Datei entsteht.
Die hatte ich wegen des "findstr" erstellt - es sollen ja nur Nummern verarbeitet werden, die noch nicht in der Ergebnisdatei stehen (siehe Zeile 8) - wenn es die Zieldatei (beim ersten Durchlauf) noch nicht gibt (und ein "2>nul", bzw in diesem Fall "2>&1", nicht verwendet wird), ist das Ergebnis eine Meldung der Art
FINDSTR: D:\Dubletten.txt kann nicht geöffnet werden.
- das ist halt nicht soo schön ... face-wink
Um im Fall des Falles eine leere Ergebnisdatei zu entsorgen, könntest auch Du am Ende
for %%i in ("%Ergebnis%") do if %%~zi==0 del "%Ergebnis%"
verwenden ...
Was die Fehleingaben anlangt - was wäre denn da so zu berücksichtigen?

Grüße
bastla

P.S.: Du hast übrigens recht - batchen macht Spaß. face-smile
smileyman
smileyman 25.05.2010 um 23:38:35 Uhr
Goto Top
Hallo Bastla,

Zitat von @bastla:
Danke für die Blumen ... face-smile

die du dir redlich verdient hast face-smile

... und sorry wegen der "spärlichen" Kommentierung. face-wink

Ne, ne - passt schon. - Ich hätte mich da ja auch dank google und co tiefer reingraben können.

das Ergebnis eine Meldung der Art
FINDSTR: D:\Dubletten.txt kann nicht geöffnet werden.
> 
- das ist halt nicht soo schön ... face-wink

Hast recht, hatte ich so nicht beachtet. - Habe es eben wieder angepasst und diesen Fall mit der Zeilenabfrage abgefangen.

Was die Fehleingaben anlangt - was wäre denn da so zu berücksichtigen?

Fehleingaben wären grundsätzlich, wenn die Faxnummer leer ist bzw. nicht dem Format +49 123 4567 3xx(x) entspricht.
Bedeutet im Endefekt, der Teil "+49 123 4567 3" ist in jeder Zeile identisch.
Die letzten Ziffern "xxx(x) können 3 oder vierstellig sein.
Es dürfen nicht mehr Zeichen sein.
- EDIT: Ah, eines vergessen, es müsste eine Ausnahmedatei geben, die doppelte oder wiedersprüchliche Einträge zulässt.

Im Endeffekt müsste ich wohl mit for / if den Anfang Prüfen, ob dieser vorhanden ist und mit "+49 123 4567 3" Zeichengenau übereinstimmt.
Weiterhin müsste ich dann prüfen, ob nach dieser Zeichenfolge genau 3 oder 4 Ziffern (keine Buchstaben oder sonstiges) stehen.
Das sollte eigentlich alles gewesen sein?! - Ausnahmedatei, hmm? - Zeilen wieder aus der Ergebnis.txt löschen?

Die erste Bedingung sollte ich ja noch hinbringen. - Bei den weiteren, hmm?

Danke
smileyman