Zeilenumbrüche vor gesuchter RegEx einfügen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
5j7o1
User
Beiträge: 5
Registriert: Dienstag 7. Mai 2019, 15:14

Hallo liebe deutsche python Community,

Ich möchte eine .txt File auswerten, eher gesagt ein WhatsApp Chatlog. Ich muss aber das Format nutzen welches iOS erstellt, da man unter Android nicht den gesamten Chatverlauf exportieren kann sondern nur die letzten 40.000 Nachrichten

Der Aufbau ist wie folgt:
[DD.MM.YY, HH:MM:SS] ‎Du hast die Gruppe “XY” erstellt.
[DD.MM.YY, HH:MM:SS] XY: ‎Nachrichten an diese Gruppe sind jetzt mit Ende-zu-Ende-Verschlüsselung geschützt.
[DD.MM.YY, HH:MM:SS] YX: Link
[DD.MM.YY, HH:MM:SS] YX: Nachricht
[DD.MM.YY, HH:MM:SS] YZ: Nachricht
[DD.MM.YY, HH:MM:SS] YZ: Nachricht
Nun möchte ich jeglichen Zeilenumbruch entfernen und bevor die RegEx Funktion genutzt wird möchte ich vor jedem
[DD.MM.YY, HH:MM:SS]
wieder einen Zeilenumbruch in die Textdatei einbinden.

Habt ihr dazu eine Idee, bzw. einen anderen Vorschlag wie man einfacher nach Daten/Kriterien filtern kann?

Danke!
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@5j7o1: Darf man fragen *warum* Du das machen willst?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
5j7o1
User
Beiträge: 5
Registriert: Dienstag 7. Mai 2019, 15:14

Warum ich die Zeilenumbrüche machen will oder das Chatlog auswerten will?`

Auswerten einfach nur aus reinem Interesse an den Daten, so bekommt man halt raus wer am meisten schreibt, zu welcher Uhrzeit, in welchen Monaten am meisten/wenigsten geschrieben wird.
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@5j7o1: Weder noch, ich wollte wissen warum Du die Zeilenumbrüche überhaupt erst entfernen willst. Was ist der Sinn hinter der Operation? Denn wenn Du die nicht entfernst, brauchst Du sie auch nicht wieder einfügen. Wobei auch das dann wieder die Frage aufwirft warum sie wieder eingefügt werden sollen.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
5j7o1
User
Beiträge: 5
Registriert: Dienstag 7. Mai 2019, 15:14

__blackjack__ hat geschrieben: Dienstag 7. Mai 2019, 15:44 @5j7o1: Weder noch, ich wollte wissen warum Du die Zeilenumbrüche überhaupt erst entfernen willst. Was ist der Sinn hinter der Operation? Denn wenn Du die nicht entfernst, brauchst Du sie auch nicht wieder einfügen. Wobei auch das dann wieder die Frage aufwirft warum sie wieder eingefügt werden sollen.
Ich würde gerne den Chatlog in ein DataFrame umbauen. Die einfachste Methode die mir dafür eingefallen ist, ist jede Zeile in dem String als neue Column in dem DataFrame zu verwenden. Allerdings sind in der Quelldatei auch die Zeilenumbrüche innerhalb der Nachrichten enthalten, nicht nur die Zeilenumbrüche vor einer neuen Nachricht (also vor dem Timestamp).
Entsprechend würde ich gerne die Zeilenumbrüche innerhalb der Nachrichten aus dem Spiel nehmen und vor dem Timestamp einen neuen einfügen.
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@5j7o1: Warum zur Hölle eine *Spalte* pro Nachricht? Es würde doch viel mehr Sinn ergeben eine Spalte für das Datum und eine für die Nachrichten zu machen und dann eine *Zeile* pro Nachricht. Beziehungsweise könnte man auch nur eine Spalte für die Nachrichten (eine pro Zeile im DataFrame) machen und das Datum als Index verwenden. Das wäre dann ja eine Zeitreihe und genau das wofür Pandas gut geeignet ist. Andererseits ist es für Textverarbeitung eher wieder nicht geeignet. Wenn Du also den Zeitstempel der Nachrichten als Index nicht auch irgendwie sinnvoll benutzt, mit Pandas-Methoden, dann macht es sehr wahrscheinlich auch keinen Sinn das ganze in einen DataFrame zu stecken.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@5j7o1: Wofür willst du pandas in diesem Zusammenhang denn verwenden? Sollen die Nachrichten nach bestimmten Kriterien gruppiert werden? Planst du bestimmte Abfragen?

Eine Spalte pro Chat-Zeile ist jedenfalls ungünstig. Stell dir einen DataFrame wie eine Tabelle vor: Jeder Datensatz ist eine Tabellenzeile. Die einzelnen Bestandteile jedes Datensatzes werden den verschiedenen Spalten zugeordnet. Hier also am sinnvollsten das Datum und die eigentliche Nachricht (wie schon zuvor erwähnt wurde). Dazu eventuell noch Sender und Empfänger. Und mit dieser Struktur kannst du dann weiterarbeiten.
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

So könnte man die Daten dann parsen:

Code: Alles auswählen

from io import StringIO
import pandas as pd

TESTFILE = StringIO("""\
[08.05.19, 06:20:03] ‎Du hast die Gruppe “XY” erstellt.
[08.05.19, 06:20:03] XY: ‎Nachrichten an diese Gruppe sind jetzt mit Ende-zu-Ende-Verschlüsselung geschützt.
[08.05.19, 06:20:11] YX: Link
[08.05.19, 06:20:55] YX: Nachricht
[08.05.19, 06:21:16] YZ: Nachricht
[08.05.19, 06:23:09] YZ: Nachricht""")

def parse_chatlog(logfile):
    splitted = (line[1:].split('] ', 1) for line in logfile)
    parsed = ((pd.to_datetime(timestamp, dayfirst=True), message.strip())
              for timestamp, message in splitted)
    return pd.DataFrame(parsed, columns=['Timestamp', 'Message'])

if __name__ == '__main__':
    print(parse_chatlog(TESTFILE))
5j7o1
User
Beiträge: 5
Registriert: Dienstag 7. Mai 2019, 15:14

Ich meine natürlich Zeile, sorry :D
Benutzeravatar
snafu
User
Beiträge: 6866
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hier mal mit einem regulären Ausdruck geparst und zusätzlicher Spalte für den (optionalen) Benutzernamen:

Code: Alles auswählen

from io import StringIO
import pandas as pd

TESTFILE = StringIO("""\
[08.05.19, 06:20:03] ‎Du hast die Gruppe “XY” erstellt.
[08.05.19, 06:20:03] XY: ‎Nachrichten an diese Gruppe sind jetzt mit Ende-zu-Ende-Verschlüsselung geschützt.
[08.05.19, 06:20:11] YX: Link
[08.05.19, 06:20:55] YX: Nachricht
[08.05.19, 06:21:16] YZ: Nachricht
[08.05.19, 06:23:09] YZ: Nachricht""")

def parse_chatlog(logfile):
    pattern = re.compile(r'\[(?P<ts>.*)\] '
                         r'((?P<user>.*): )?'
                         r'(?P<message>.*)')
    groups = (pattern.match(line).groupdict() for line in logfile)
    parsed = (
        (pd.to_datetime(g['ts'], dayfirst=True), g['user'] or '', g['message'])
        for g in groups
    )
    return pd.DataFrame(parsed, columns=['Timestamp', 'Username', 'Message'])

if __name__ == '__main__':
    print(parse_chatlog(TESTFILE))
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei ja irgendwo die Info stand das in den Nachrichten selbst auch Zeilenumbrüche vorkommen können, man kann das also nicht als eine Zeile = eine Nachricht behandeln.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
5j7o1
User
Beiträge: 5
Registriert: Dienstag 7. Mai 2019, 15:14

Ja genau, in vielen Nachrichten mit Links/Antworten auf Nachrichten sind Zeilenumbrüche in dieser Nachricht vorhanden, die ignoriert werden müssen. Deswegen wollte ich ja alle Zeilenumbrüche entfernen und vor jeden Timestamp einen einfügen um diese unnötigen Zeilenumbrüche zu eliminieren
Benutzeravatar
__blackjack__
User
Beiträge: 14042
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@5j7o1: Sind die denn unnötig? Die sind ja schon Bestandteil der Nachrichten. Ich würde die beibehalten. Man muss halt die Eingabe in Nachrichten aufteilen, wobei eine Nachricht jeweils mit einem Zeitstempel beginnt.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten