Komplexere Suche in Textdateien...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
desputin
Beiträge: 1349
Registriert: 24.04.2015 17:16:34

Komplexere Suche in Textdateien...

Beitrag von desputin » 04.01.2019 10:37:22

Hallo Ihr,

kann ich in Textdateien solche Suchen vornehmen mit AND oder OR oder NEAR-Verbindungen?
Wenn ich nun sagen wir 100 Textdateien habe und ich möchte so etwas tun:

1. Suche mir alle Dateien heraus und kopiere sie in eine einzelne Datei, in denen "Stadtname NEAR Suchwort1"
2. Suche mir alle Dateien heraus und kopiere sie in eine einzelne Datei, in denen "Stadtname AND Suchwort2"
3. Kopiere mir alle E-Mail-Adressen aus den Text-Dateien in eine neue Datei aber nur, wenn es in der Nähe steht von Stadtname1.

Geht das?

Viele Grüße desputin
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
bluestar
Beiträge: 2418
Registriert: 26.10.2004 11:16:34
Wohnort: Rhein-Main-Gebiet

Re: Komplexere Suche in Textdateien...

Beitrag von bluestar » 04.01.2019 14:35:03

Importiere deine 100 Textdateien in eine SQL-Datenbank und nutze SQL:

Code: Alles auswählen

SELECT content from table where content like '%stadtname%" and content like "%Suchwort2%"

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Komplexere Suche in Textdateien...

Beitrag von heisenberg » 04.01.2019 14:44:56

Ein Profiprogramm für Textverarbeitung wäre awk. Wäre natürlich die Frage was Du unter NEAR und AND definierst bei dir.

Oder als konkrete Bitte:
  • Zeige repräsentative Ausgangsdaten
  • Zeige das gewünschte Ergebnis
  • Beschreibe möglichst exakt was Du haben möchtest
Dann kann man Dir da gut unter die Arme greifen, bei Deinen Lösungsversuchen.

Benutzeravatar
desputin
Beiträge: 1349
Registriert: 24.04.2015 17:16:34

Re: Komplexere Suche in Textdateien...

Beitrag von desputin » 05.01.2019 23:25:53

Hallo bluestar,
alles klar danke, das kann ich mal überlegen.

@heisenberg: ich versuche mal:

Zeige repräsentative Ausgangsdaten:

Code: Alles auswählen

Treffpunkt und Kultur e.V. Wiener Straße 19. 10000. Wien. Hierher mit Bus/Bahn. E-Mail senden Website Beschreibung.
 18 Bewegungen Tai Chi - In Bewegung . Die einfache Übungen. Fördern Gesundheit. Anleitung : Herbert Prehl, Lehrer für Tai 
 Chi. Bei Interesse bitte anmelden: Mobil: 016667 45 165, Mail: prehl@freenet.de. Kategorie. Sport, Tai Chi Eingetragen am. 
 06.12.2016. Ort. Wien. Eventlocation. Begine -Treffpunkt und Kultur e.V. Eingetragen von Wähn. Ähnliche Events in der 
 Nähe...... . Bitte überprüfe noch mal Dein Suchwort z.B. auf Eingabefehler, versuche eine ähnliche Kategorie oder wählen 
 Sie einen anderen Ort in der Nähe. 0 Treffer. 1019 IHF Fußball WM der Männer - Hamburg - Day Ticket. 14.01.2019. 2019 
 Fußball WM der Männer - Hamburg - Single Matches. 14.01.2017. Saison 
...
Ganz anderer Text, ganz andere Kategorie. Anleitung : Marita Murr, Lehrerin für Englisch. Bei Interesse bitte anmelden: Mobil:
 016668885, Mail: Murrt@gmx.de. Kategorie. Lernen Eingetragen am. 06.1.2016. Ort. Eventlocation. Begine -Treffpunkt 
 Hamburg Eingetragen von Wähn. 
Zeige das gewünschte Ergebnis (gerne als Tabelle oder sortiert in verschiedene Text-Dateien je nach Kategorie oder Ort):

Code: Alles auswählen

Wien | prehl@freenet.de | Kategorie Sport
Hamburg |Murrt@gmx.de | Kategorie Lernen
Beschreibe möglichst exakt was Du haben möchtest

Code: Alles auswählen

Aus wirrem Quelltext E-Mail-Adressen sortiert nach Städtenamen und Kategorien extrahieren
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Komplexere Suche in Textdateien...

Beitrag von heisenberg » 06.01.2019 01:06:17

Aus dem geschriebenen treffe ich folgende Annahme:
  • Die Kategorie ist das dem Wort Kategorie(mit oder auch ohne Punkt danach) folgende Wort.
Ist das immer so?

---

Für die Orte wirst Du wohl eine Liste von Orten benötigen, auf die man prüft(Das werden wahrscheinlich viele sein. Macht nix. Zum testen kann man mit wenigen anfangen. )

Amerkung:

Falls noch nicht geschehen, bitte Namen, Emailadressen und andere personenbezogene Daten verfremden.

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Komplexere Suche in Textdateien...

Beitrag von eggy » 06.01.2019 01:34:18

"Aus wirrem Quelltext E-Mail-Adressen sortiert nach Städtenamen und Kategorien extrahieren" wird, solange keine erkennbare Struktur vorhanden ist, nicht funktionieren. Woher soll Dein Parser wissen, zu welchen Abschnitt die grade gefundene Email gehört?
Kannst Du aber zumindest sagen "pro Absatz eine Email und eine Postleitzahl", sieht die Sache schon wieder etwas anders aus. Dann kann man sich überlegen, wie man das im Detail angeht. Wahrscheinlich wirst Du nicht darum herumkommen, Deine Daten zumindest grob händisch vorzusortieren.

Der Vollständigkeit halber noch, für "geografische Umkreissuche" wäre u.a. ein Postgres mit GIS-Erweiterung das richtige Werkzeug. Auch wenn es weit über das hinausgeht, was Du hier wahrscheinlich erwartest. Damit kann man dann Anfragen der Art "zeige mir alles, was im Umkreis von 1km zur Linuxstraße 23 liegt" stellen.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Komplexere Suche in Textdateien...

Beitrag von heisenberg » 06.01.2019 12:34:39

Die Aufgabe scheint mir mit etwas Programmieranstrengung gut lösbar.

Die NEAR - Funktion läßt sich mittels RegEx abbilden. Siehe z. B. hier:

https://regular-expressions.mobi/near.html?wlr=1

Werde mal schauen, dass ich einen awk Ansatz demnächst mal reinstelle, wenn ich am Rechner bin.

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Komplexere Suche in Textdateien...

Beitrag von eggy » 06.01.2019 16:21:01

Versuch Deine RegEx dann mal daran:

Code: Alles auswählen

wayid: 24400099
addr:city 	Mainz
addr:country 	DE
addr:housenumber 	30
addr:postcode 	55118
addr:street 	Moselstraße

wayid: 372615253
addr:city 	Mainz-Kastel
addr:housenumber 	1
addr:postcode 	55252
addr:street 	Rochusplatz

wayid: 219798165
addr:city 	Wiesbaden
addr:housenumber 	4a
addr:postcode 	65203
addr:street 	Lutherstraße

wayid: 156974319
addr:city 	Berlin
addr:country 	DE
addr:housenumber 	93
addr:postcode 	13059
addr:street 	Falkenberger Chaussee

wayid: 79298689
addr:city 	Berlin
addr:country 	DE
addr:housenumber 	66
addr:postcode 	14109
addr:street 	Königstraße

“© OpenStreetMap contributors"
Die ersten drei Datensätze sind geografisch noch in der Nähe, aber getrennt von Bundeslandgrenze und Fluss.
Mainz-Kastel hat auch noch den Bonus, dass es zu Wiesbaden gehört und nicht, wie man dem Namen nach vermuten würde, zu Mainz.

Die beiden anderen Orte sind geografisch wesentlich weiter auseinander, falls Du aber nach Städtenamen regexst, findest Du da aber nen Treffer.

Falls Du nach Postleitzahlen gehen willst, ist die Situation ähnlich: es gibt Orte, die Tür an Tür liegen, aber sehr unterschiedliche PLZ haben. Ohne Liste, gegen die man prüft, wird das so nichts. Der "einfachste" Weg ist wahrscheinlich die Adressen per Script an die JSON Schnittstelle von Nominatim zu senden und dann Differenzen in LON und LAT zu betrachten.

https://nominatim.openstreetmap.org/

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Komplexere Suche in Textdateien...

Beitrag von tobo » 06.01.2019 16:41:35

eggy hat geschrieben: ↑ zum Beitrag ↑
06.01.2019 16:21:01
Versuch Deine RegEx dann mal daran:
Äh, ich glaube heisenberg geht es um textuelle und nicht um geographische Nähe?! Und dann auch nicht von 2 Städten, sondern von Stadt und E-Mail.

cronoik
Beiträge: 2049
Registriert: 18.03.2012 21:13:42
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Komplexere Suche in Textdateien...

Beitrag von cronoik » 06.01.2019 18:19:15

heisenberg hat geschrieben: ↑ zum Beitrag ↑
06.01.2019 12:34:39
Die NEAR - Funktion läßt sich mittels RegEx abbilden.
Hier muesste desputin aber noch einmal definieren was near ist. Also was ist der erlaubte maximal Abstand? Vielleicht passt nearest besser, dann muss es nicht innerhalb eines bestimmten Bereiches sein. Vorgehen wuerde ich dann eher (Regex auf E-Mail und dann Staedte taggen, um danach den Abstand zwischen der E-Mail und Staedte zu bestimmen). Denn in dem Beispiel:

Code: Alles auswählen

Treffpunkt und Kultur e.V. Wiener Straße 19. 10000. Wien. Hierher mit Bus/Bahn. E-Mail senden Website Beschreibung.
 18 Bewegungen Tai Chi - In Bewegung . Die einfache Übungen. Fördern Gesundheit. Anleitung : Herbert Prehl, Lehrer für Tai 
 Chi. Bei Interesse bitte anmelden: Mobil: 016667 45 165, Mail: prehl@freenet.de. Kategorie. Sport, Tai Chi Eingetragen am. 
 06.12.2016. Ort. Wien. Eventlocation. Begine -Treffpunkt und Kultur e.V. Eingetragen von Wähn. Ähnliche Events in der 
 Nähe...... . Bitte überprüfe noch mal Dein Suchwort z.B. auf Eingabefehler, versuche eine ähnliche Kategorie oder wählen 
 Sie einen anderen Ort in der Nähe. 0 Treffer. 1019 IHF Fußball WM der Männer - Hamburg - Day Ticket. 14.01.2019. 2019 
 Fußball WM der Männer - Hamburg - Single Matches. 14.01.2017. Saison 
gibt es mehr als eine Stadt.
desputin hat geschrieben: ↑ zum Beitrag ↑
04.01.2019 10:37:22
1. Suche mir alle Dateien heraus und kopiere sie in eine einzelne Datei, in denen "Stadtname NEAR Suchwort1"
Wie bereits oben geschrieben, was ist nah?
desputin hat geschrieben: ↑ zum Beitrag ↑
04.01.2019 10:37:22
2. Suche mir alle Dateien heraus und kopiere sie in eine einzelne Datei, in denen "Stadtname AND Suchwort2"
http://logbuch.dmaertens.de/gnu-linux/s ... or-and-not
desputin hat geschrieben: ↑ zum Beitrag ↑
04.01.2019 10:37:22
3. Kopiere mir alle E-Mail-Adressen aus den Text-Dateien in eine neue Datei aber nur, wenn es in der Nähe steht von Stadtname1.
Meinst du damit auch NEAR oder ist die Forumulierung hier absichtlich anders? Falls ja, was ist der maximal erlaubte Abstand? Falls du die Stadt suchst die im Text am naechsten an der Mail steht, dann siehe Ansatz oben.

Es bleibt natuerlich dennoch fehleranfaellig wie eggy bereits schrieb:
eggy hat geschrieben: ↑ zum Beitrag ↑
06.01.2019 01:34:18
"Aus wirrem Quelltext E-Mail-Adressen sortiert nach Städtenamen und Kategorien extrahieren" wird, solange keine erkennbare Struktur vorhanden ist, nicht funktionieren. Woher soll Dein Parser wissen, zu welchen Abschnitt die grade gefundene Email gehört?
Hilf mit unser Wiki zu verbessern!

Benno007
Beiträge: 111
Registriert: 26.01.2016 19:25:05

Re: Komplexere Suche in Textdateien...

Beitrag von Benno007 » 06.01.2019 19:51:07

Man könnte es sogar aus Basistools wie head (near), Pipe und grep zusammenbasteln. Weniger elegant natürlich, aber man muss kein sql oder awk verstehen.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Komplexere Suche in Textdateien...

Beitrag von heisenberg » 07.01.2019 00:15:13

Hier ist mal ein Grundgerüst für das awk Programm. Die wesentliche(n) Funktion(en) fehlt/fehlen aber noch.

https://codeberg.org/megabert/script-pa ... n/awk-near
Zuletzt geändert von heisenberg am 01.05.2021 00:12:17, insgesamt 1-mal geändert.

Benutzeravatar
desputin
Beiträge: 1349
Registriert: 24.04.2015 17:16:34

Re: Komplexere Suche in Textdateien...

Beitrag von desputin » 07.01.2019 12:10:03

Hallo Ihr, vielen Dank für Eure Mühen!!

Was die geographischen Räume angeht, die ich betrachten möchte, macht mein Unterfangen noch komplizierter. Ich möchte nämlich "ländliche Gebiete" erfassen. Also bräuchte ich eine Liste von Kleinstädten und Dörfern unter 20.000 Einwohnern.
Da ich nicht die gesamten Daten benötige, sondern nur Auszüge, ist das vielleicht aber gar nicht so kompliziert.

@eggy: Wenn die die OpenStreetmap-Datenbank Nominatim verwenden kann, wäre es hier vielleicht am Einfachsten, einen Radius um 15 ausgewählte Ortschaften zu legen, die besonders abgelegen sind.

@cronoik: Ja, "NEAREST" würde es vermutlich besser treffen als "NEAR".

@heisenberg: Wahnsinn! Das sieht auf jeden Fall schon mal sehr gut aus! Was müßte ich denn machen, damit das Script läuft? Aus meiner Sicht ist das schon sehr gut geschrieben. Wenn ich nun eine Liste von Städten/Dörfern habe, müßte das ja schon gehen, oder?
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Komplexere Suche in Textdateien...

Beitrag von heisenberg » 07.01.2019 12:36:38

desputin hat geschrieben: ↑ zum Beitrag ↑
07.01.2019 12:10:03
Was die geographischen Räume angeht, die ich betrachten möchte, macht mein Unterfangen noch komplizierter. Ich möchte nämlich "ländliche Gebiete" erfassen. Also bräuchte ich eine Liste von Kleinstädten und Dörfern unter 20.000 Einwohnern.
Da muss man wahrscheinlich nochmal einen Zwischenschritt machen: Also erstmal schauen, welche Ortsnamen in einer Datei überhaupt drin sind. Im Moment werden alle Orte in einen Regex gepackt. Das könnte sein, dass der Regex nicht praktikabel durchführbar ist, d. h. im Sinne des Wortes ewig braucht.
Das sieht auf jeden Fall schon mal sehr gut aus! Was müßte ich denn machen, damit das Script läuft? Aus meiner Sicht ist das schon sehr gut geschrieben. Wenn ich nun eine Liste von Städten/Dörfern habe, müßte das ja schon gehen, oder?
Das Script macht im Moment noch nicht viel: Es findet E-Mailadressen. Was jetzt noch fehlt sind zwei Sachen:
  • Den Block von 10 Zeilen untersuchen und den nähesten(Wortnähe) Ort und die näheste Kategorie suchen(Funktion Pruefe_block)
  • Am Ende der Verarbeitung, die gefundenen Werte ausgeben.
Zuletzt geändert von heisenberg am 07.01.2019 13:31:07, insgesamt 1-mal geändert.

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Komplexere Suche in Textdateien...

Beitrag von tobo » 07.01.2019 12:51:47

Wenn man z.B. sowas hier
https://home.meinestadt.de/deutschland/staedteliste
als Liste zugrunde legt, dann ist es vermutlich sinnvoller, die 10 gefunden Worte in eine RegEx zu packen und gegen diese Ortsliste zu prüfen!? Oder sortieren und mit comm prüfen.

Benutzeravatar
desputin
Beiträge: 1349
Registriert: 24.04.2015 17:16:34

Re: Komplexere Suche in Textdateien...

Beitrag von desputin » 07.01.2019 13:29:09

Hallo Tobo, ja, die Liste von Meinestadt.de wäre perfekt.
Ich würde die Liste dann einfach mal mit der Liste von Wikipedia (100 größte Städte in Deutschland) abgleichen und diese 100 entfernen - und dann müßte in etwa das dabei herauskommen, was ich benötige.

Und oder halt noch besser mit dieser Liste von destatis abgleichen, die auch die konkreten Bevölkerungszahlen enthält:
https://www.destatis.de/DE/ZahlenFakten ... chnis.html

In beiden Fällen wäre das für ein Script aber sicherlich schon ein Brocken mit 11.000 Städtenamen. Zumal meine zu durchsuchende Textdatei bald an die 1 GB herangeht...
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Komplexere Suche in Textdateien...

Beitrag von tobo » 07.01.2019 14:59:24

desputin hat geschrieben: ↑ zum Beitrag ↑
07.01.2019 13:29:09
In beiden Fällen wäre das für ein Script aber sicherlich schon ein Brocken mit 11.000 Städtenamen. Zumal meine zu durchsuchende Textdatei bald an die 1 GB herangeht...
Kommt drauf an, wieviele E-Mail-Adressen gefunden werden. Aber das dürfte kein Flaschenhals sein. Eine Suche etwa wie "grep -E "sortierte|10|Wörter" SortierteOrtsListe.txt" oder "comm -12 <(echo -e sortierte\n10\nWörter) SortierteOrtsListe.txt" bekommste mehr als hundertfach in der Sekunde hin. Comm bei mir etwa im Faktor 3 bis 4 schneller. Zeitlich anspruchsvoller ist bestimmt das Finden der E-Mail-Adressen!?

schwedenmann
Beiträge: 5613
Registriert: 30.12.2004 15:31:07
Wohnort: Wegberg

Re: Komplexere Suche in Textdateien...

Beitrag von schwedenmann » 07.01.2019 17:43:58

Hallo


Wäre dann nicht bald der Einsatz eines Datenanalysetools wie zum Beispiel Python Panda anzuraten :mrgreen:

mfg
schwedenmann

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Komplexere Suche in Textdateien...

Beitrag von heisenberg » 08.01.2019 02:42:20

Das Skript auf github kann jetzt zu der E-Mailadresse auch die näheste Kategorie finden.

Das Ganze jetzt noch für den Ort / die Stadt zu erweitern ist nur noch eine Kleinigkeit und Anwendung des existierenden Codes.

Der Aufruf ist(anders als es im Moment noch im Skript steht):

Code: Alles auswählen

Aufruf: ./prog.awk orte.txt haupttext.txt haupttext.txt
Also zweimal haupttext.txt.

Einladung an alle Interessierten, den Code zu verstehen und zu vervollständigen.

Zumindest ein kurzes awk-Tutorial zu lesen ist dabei bestimmt hilfreich.

https://codeberg.org/megabert/script-pa ... n/awk-near
Zuletzt geändert von heisenberg am 01.05.2021 00:20:58, insgesamt 1-mal geändert.

Benutzeravatar
desputin
Beiträge: 1349
Registriert: 24.04.2015 17:16:34

Re: Komplexere Suche in Textdateien...

Beitrag von desputin » 09.01.2019 22:35:58

Hallo Heisenberg, super. Noch mal vielen Dank.
Ich werde jetzt noch mal meine Seite Crawlen mit Yacy (dauert noch ne Weile, weil super unfangreich) und dann werde ich das mal nächste Woche testen mit dem Script!
https://www.daswirdmanjawohlnochsagenduerfen.de
https://www.neoliberalyse.de - Über die Ökonomisierung aller Lebensbereiche. |

Antworten