Bash: Email und Name auslesen
Hallo zusammen
Brauche eure Hilfe, verzweifle fast...
Muss aus einer grossen csv Datei mit HTML Inhalt E-Mail Adresse und Name, Vorname auslesen. Das ganze auf Unix mit Bash...
Nun habe ich es geschafft alle E-Mail Adressen auszulesen und zwar mit folgendem code:
nun fehlt mir noch der Name und Vorname der Person.
Der HTML Code sieht ungefähr immer gleich aus:
Struktur: Name und Vorname sind immer im <p class=""Untertitel""></p>, jedoch sind auch solche Untertitel einträge vorhanden die nichts mit dem zu tun haben.
Da nicht wirklich eine genaue Struktur zu erkennen ist und im nachhinein erkennlich sein soll welcher Name zu welcher Adresse gehört funktioniert das laut einem Kollegen nicht mit meinem grep Script...
Ich hatte schon für dieses kleine Script ein ganzen Tag da ich Neuling bin und wäre sehr dankbar wenn mir jemand helfen könnte...
Vielleicht gibt es ja eine Lösung wie such mit regex oder sowas nach der E-Mail Adresse und geh dann zurück zum 1 Untertitel und nimm den Namen...
Brauche eure Hilfe, verzweifle fast...
Muss aus einer grossen csv Datei mit HTML Inhalt E-Mail Adresse und Name, Vorname auslesen. Das ganze auf Unix mit Bash...
Nun habe ich es geschafft alle E-Mail Adressen auszulesen und zwar mit folgendem code:
#/bin/bash
if [ -f "$1" ]; then
grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' "$1" | sort | uniq -i >>'/script/result/adressen-$(date "+%d-%m-%Y").csv'
else
echo "Expected a file at $1, but it doesn't exist." >&2
exit 1
fi
nun fehlt mir noch der Name und Vorname der Person.
Der HTML Code sieht ungefähr immer gleich aus:
<td valign=""top"">
<p class=""Untertitel"">Vorname Name</p>
<p class=""Ueberschrift3"">blabla</p>
<p class=""Haupttext""> </p>
<p class=""Haupttext"">Adresse</p>
<p class=""Haupttext"">PLZ Ort</p>
<p class=""Haupttext"">Tel</p>
<p class=""Haupttext"">Mobile</p>
<p class=""Haupttext"">E-Mail Adresse</p>
</td>
Struktur: Name und Vorname sind immer im <p class=""Untertitel""></p>, jedoch sind auch solche Untertitel einträge vorhanden die nichts mit dem zu tun haben.
Da nicht wirklich eine genaue Struktur zu erkennen ist und im nachhinein erkennlich sein soll welcher Name zu welcher Adresse gehört funktioniert das laut einem Kollegen nicht mit meinem grep Script...
Ich hatte schon für dieses kleine Script ein ganzen Tag da ich Neuling bin und wäre sehr dankbar wenn mir jemand helfen könnte...
Vielleicht gibt es ja eine Lösung wie such mit regex oder sowas nach der E-Mail Adresse und geh dann zurück zum 1 Untertitel und nimm den Namen...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 227550
Url: https://administrator.de/contentid/227550
Ausgedruckt am: 22.11.2024 um 20:11 Uhr
29 Kommentare
Neuester Kommentar
Hallo SIPSIP,
gibt dir die Daten mit Pipe-Zeichen voneinander getrennt so aus:
Grüße Uwe
cat "testdatei.txt" | tr -d "\n" | sed 's/<td valign=""top"">/\n/g' | gawk 'BEGIN {names="";mail=""}; match($0,/<p class=""Untertitel"">([^<]*)<\/p>/,arr){names=arr[1]};match($0,/([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+)/,arr_mail){mail=arr_mail[1]; print names"|"mail;}'
Max Mustermann|max@mustermann.de
Herbert Meier|herbert@meier.com
Zitat von @SIPSIP:
Schon mal vielen Dank Leute ihr seit wahrscheinlich meine Rettung
Ich probier die mal aus
PS: Ja das sehe ich genau so, dass das zu schwer für mich als Anfänger ist... wusste nichtmal mit welchen Kommandos ich
das überhaupt hinbekomme.
Schon mal vielen Dank Leute ihr seit wahrscheinlich meine Rettung
Ich probier die mal aus
PS: Ja das sehe ich genau so, dass das zu schwer für mich als Anfänger ist... wusste nichtmal mit welchen Kommandos ich
das überhaupt hinbekomme.
Nützliche sed-Einzeiler.
lks
Zitat von @SIPSIP:
Könnt ich den den Abschnitt auf das ganze File erweitern? oder erkennt es dan nicht mehr welcher Name, Vorname zu welcher
Mail gehört?
Könnt ich den den Abschnitt auf das ganze File erweitern? oder erkennt es dan nicht mehr welcher Name, Vorname zu welcher
Mail gehört?
Zitier doch mal eine etwas längers Stück aus der Datei, damit wir sehen, auf was wir triggern können. Ich bin dazvon ausgegengen, daß Du eine Datei hast, in der Hintereinander weg die ganzen records im obigen Format abgelegt sind. Wenn Du genauer spezifizierst, könen wir dir auch bessere Lösungen anbieten.
Hast Du eine Textdatei, in denen viele von den obigen Feldern stehen? Und steht dazwischen auch anderer HTML-Code? Stell mal eine Datei hier rein, die ein paar Datensätze mehr hat, damit wir unsere Skripte drauf loslassen können. Alternativ könntest Du natürlich auch das ergebnis unserer Skripte posten, wenn die auf Deine Dateien losgelassen werden.
lks
Muss aus einer grossen csv Datei mit HTML Inhalt E-Mail Adresse und Name, Vorname auslesen. Das ganze auf Unix mit Bash...
Ach ja:
Ist das eine CSV oder eine HTML-Datei. CSV-dateien haben normalerweise Komma, Strichpunkte o.ä. als Feld-Trenner.
udn wenn Du Daten aus eienr MySQL-datei exportierst. Warum machst Du das nicht gleich im richtigen Format, statt ersmal nach HTML zu exportieren und dann nach normalem Text (csv) zu wandeln?
lks
Kannst du mal den Code ohne Zeilennummerierung reinstellen? (Einfach type=plain in den code-Tag mit rein). Dann kann man das einfach mal mit copy&paste an die sed-zeile verfüttern anstatt das erst in eine textdatei reinzuschieben und dann dann die zeilennummern rauszulöschen.
lks
Nachtrag: Und markiere mal die Tabellenelemete, so daß man sieht, wo jeweils ein Tabelleneintrag beginnt und wo einer endet, damit man einen Anhaltspunkt hat, wie ein einzelner tabelleneintrag aussieht.
Nahctrag2. Kann derjenige, der da auf den --Button geklickt hat mir per PM mal sagen, was ihn an meinem Kommentar stört?
lks
Nachtrag: Und markiere mal die Tabellenelemete, so daß man sieht, wo jeweils ein Tabelleneintrag beginnt und wo einer endet, damit man einen Anhaltspunkt hat, wie ein einzelner tabelleneintrag aussieht.
Nahctrag2. Kann derjenige, der da auf den --Button geklickt hat mir per PM mal sagen, was ihn an meinem Kommentar stört?
Wenn ich den obigen textschnipsel an meine Skript-zeile verfüttere bekomme ich:
Vorname Name;</td></tr></tbody></table>""blabla
was machst Du anders?
lks
Jetzt weiß ich es.
du kannst bei dem Code oben rechts in der Ecke auf Quellcode klicken, dann erscheint er ohne die Nummerierung ;)
Das hatte ich vor Deinem Posting nicht bemerkt, obwohl ich schon einige Jahre hier unterwegs bin. Wieder was gelernt.
lks
Nachtrag: Da ich klickfaul bin, wäre es trotzdem einfacher gleich ohne Nummerierugn reinzusctellen. Dann spart man sich mehrere klicks.
Zitat von @SIPSIP:
@Endoro deine sed Zeile funktioniert grundsätzlich, jedoch erscheint auch all der andere Text der in <p
class=""Untertitel""> enthalten ist. Ausserdem ist die Ausgabe nicht strukturiert
@Endoro deine sed Zeile funktioniert grundsätzlich, jedoch erscheint auch all der andere Text der in <p
class=""Untertitel""> enthalten ist. Ausserdem ist die Ausgabe nicht strukturiert
Von weiterem Text im "Untertitel"-Feld weiss ich nichts, bitte genauer beschreiben. Es wird nur das direkt vor der Mail liegende Feld ausgegeben.
Wenn ich wüsste, wie die Ausgabe strukturiert sein soll ...
Gruss.
kann gerade nicht an mein Linux, aber wenn du möchtest kannst du die Textdateien durch folgendes Powershell-Script jagen:
es extrahiert die Daten von allen Textdateien in einem Verzeichnis, und exportiert dies dann in eine CSV-Datei. Geht hier mit deinem Demo-Fetzen von oben einwandfrei.
Grüße Uwe
$pathFiles = "D:\*.txt"
$pathCSV = "D:\Adressen.csv"
$list = @()
$regex = [regex] '(?is)<td valign=""top"">\s*<p class=""Untertitel"">.*?([^<>]*?)</p>.*?([a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6})'
foreach($file in (dir $pathFiles)){
$subject = gc $file.FullName
$match = $regex.Match($subject)
while ($match.Success) {
$name = $match.Groups[1].Value.trim()
$mail = $match.Groups[2].Value.trim()
$list += New-Object PSObject -Property @{"Name"=$name;"E-Mail"=$mail}
$match = $match.NextMatch()
}
}
$list | export-csv $pathCSV -Delimiter ";" -NoTypeInformation
Grüße Uwe