Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Doppelte Einträge in einer TXT in andere Datei ausfiltern

Frage Entwicklung Batch & Shell

Mitglied: smileyman

smileyman (Level 1) - Jetzt verbinden

24.05.2010, aktualisiert 22:37 Uhr, 5783 Aufrufe, 6 Kommentare

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
Mitglied: bastla
24.05.2010 um 23:17 Uhr
Hallo smileyman!

Versuch es mal so:
01.
@echo off & setlocal 
02.
set "Liste=D:\Tel-Liste.txt" 
03.
set "Ergebnis=D:\Dubletten.txt" 
04.
 
05.
copy nul "%Ergebnis%">nul 
06.
set "First=True" 
07.
for /f "usebackq tokens=2 delims=," %%i in ("%Liste%") do ( 
08.
    findstr /c:"%%i," "%Ergebnis%">nul||( 
09.
        for /f %%a in ('find /c "%%i,"^<"%Liste%"') do if %%a gtr 1 ( 
10.
            if not defined First >>"%Ergebnis%" echo --- 
11.
            set "First=" 
12.
            findstr /c:"%%i," "%Liste%">>"%Ergebnis%" 
13.
14.
15.
)
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
Bitte warten ..
Mitglied: LotPings
25.05.2010 um 08:51 Uhr
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
Bitte warten ..
Mitglied: bastla
25.05.2010 um 11:36 Uhr
Hallo LotPings!
Ganz schön tricky, hat etwas gedauert den zu verstehen.
Ich hab' ja auch keinen Platz für Kommentare verschwendet ...

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
Bitte warten ..
Mitglied: smileyman
25.05.2010 um 22:44 Uhr
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.
Ich glaube ich muss doch wieder mehr mit Batch machen. - Wenn man dir so zuschaut, macht das einfach Spaß

Danke für deine Unterstützung.

smileyman
Bitte warten ..
Mitglied: bastla
25.05.2010 um 23:04 Uhr
Hallo smileyman!

Danke für die Blumen ...

... und sorry wegen der "spärlichen" Kommentierung.
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 ...
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ß.
Bitte warten ..
Mitglied: smileyman
25.05.2010 um 23:38 Uhr
Hallo Bastla,

Zitat von bastla:
Danke für die Blumen ...

die du dir redlich verdient hast

... und sorry wegen der "spärlichen" Kommentierung.

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 ...

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
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (18)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...