Heyho
Ich habe hier eine Textdatei, welche ich Zeilenweise auslese. Hierbei handelt es sich um einen exportierten Chat aus WhatsApp.
In fast jeder Zeile stehen immer die selben Informationen in immer gleicher Reihenfolge.
Hier ein Beispiel:
Spoiler anzeigen
Es sollte eigentlich ersichtlich sein, aber am Anfang steht das Datum, dann die Uhrzeit gefolgt vom Absender und danach die Nachricht. Wie man sieht kann es vorkommen, dass die Nachricht in der nächsten Zeile weitergeht. Das kann vorkommen, wenn in einer Nachricht manuell eine neue Zeile angefangen wurde (wie man es hier mit der Entertaste macht).
Zuerst habe ich es mit RegEx probiert (wobei ich gestehen muss, dass ich null Erfahrung mit RegEx habe und mir im Internet das Pattern rausgesucht habe und es anschließend nach dem Motto "Trial and Error" angepasst habe) und mir folgende Funktion gebaut:
Und dazu meine Patterns:
Datum:
Uhrzeit:
Absender:
Das Funktioniert auch sehr gut muss ich sagen...
...bis auf die Ausnahme, dass wenn die Nachricht in einer neuen Zeile weitergeht, aber mit einem Datum bzw. einer Uhrzeit beginnt, er das natürlich erkennt und als neue Nachricht interpretiert, was natürlich die Daten verfälscht (im Programm).
Dazu habe ich folgende Logik um den Chat auszulesen:
Spoiler anzeigen
In der If-Abfrage ab Zeile #17 überprüfe ich, ob irgendwas von den Werten "leer" ist (und interpretiere es demnach nicht als neue Nachricht!) und füge es im Dataset der letzten Nachricht bei.
Da ich eben nun das Problem habe, dass er die Nachricht als neue Interpretiert, habe ich versucht das ganze mittels SubString auszulesen. Folgend die Funktion dafür:
Spoiler anzeigen
Das bringt mir aber noch mehr Probleme, denn wenn die Nachricht der neuen Zeile weniger Zeichen hat als ich im SubString abfrage, stürzt es natürlich ab. Ich könnte es mit Try-Catch Abfangen,
Das ist viel Text und rumgefasel von mir auf einmal, während ich den Text geschrieben habe kamen und gingen neue Ideen, deswegen könnte er ein wenig schwer zu verstehen sein. Ich bitte um Entschuldigung.
Wenn jemand eine Idee hat, wie ich das besser angehen könnte, so möge er hervortreten.
Einen angenehmen Rest-Abend wünsche ich.
Ich habe hier eine Textdatei, welche ich Zeilenweise auslese. Hierbei handelt es sich um einen exportierten Chat aus WhatsApp.
In fast jeder Zeile stehen immer die selben Informationen in immer gleicher Reihenfolge.
Hier ein Beispiel:
Quellcode
- 23.04.16, 00:03 - Peter: Beispieltext
- 23.04.16, 00:04 - Peter: Beispieltext
- 23.04.16, 00:05 - Hans: Beispieltext
- 23.04.16, 01:37 - Dieter: Beispieltext
- Beispieltext in neuer Zeile
- Beispieltext in neuer Zeile
- 23.04.16, 13:15 - Ulrich: Beispieltext
- 23.04.16, 13:25 - Arno: Beispieltext
- Beispieltext in neuer Zeile
- 23.04.16, 14:25 - Arno: Beispieltext
- 23.04.16, 14:26 - Max: Beispieltext
- 23.04.16, 14:26 - Max: Beispieltext
- 23.04.16, 14:29 - Reinhard: Beispieltext
Es sollte eigentlich ersichtlich sein, aber am Anfang steht das Datum, dann die Uhrzeit gefolgt vom Absender und danach die Nachricht. Wie man sieht kann es vorkommen, dass die Nachricht in der nächsten Zeile weitergeht. Das kann vorkommen, wenn in einer Nachricht manuell eine neue Zeile angefangen wurde (wie man es hier mit der Entertaste macht).
Zuerst habe ich es mit RegEx probiert (wobei ich gestehen muss, dass ich null Erfahrung mit RegEx habe und mir im Internet das Pattern rausgesucht habe und es anschließend nach dem Motto "Trial and Error" angepasst habe) und mir folgende Funktion gebaut:
Und dazu meine Patterns:
Datum:
\d{2}(\.)\d{2}(\.)\d{2}
Uhrzeit:
(0.|[1][0-9]|[2][0-3])(\:)[0-5][0-9]((\:)[0-5][0-9]|)(\,[0-5][0-9]|)
Absender:
(-([^-])*:)
Das Funktioniert auch sehr gut muss ich sagen...
...bis auf die Ausnahme, dass wenn die Nachricht in einer neuen Zeile weitergeht, aber mit einem Datum bzw. einer Uhrzeit beginnt, er das natürlich erkennt und als neue Nachricht interpretiert, was natürlich die Daten verfälscht (im Programm).
Dazu habe ich folgende Logik um den Chat auszulesen:
VB.NET-Quellcode
- Private Sub bgwAuslesen_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles bgwAuslesen.DoWork
- Dim row = DirectCast(e.Argument, WhatsApp.WhatsAppChatRow)
- Dim Inhalt = IO.File.ReadAllLines(row.Pfad).ToList
- _IstWertFürProgressbar = True
- bgwAuslesen.ReportProgress(Inhalt.Count)
- For i As Integer = 0 To Inhalt.Count - 1
- Dim line = Inhalt(i)
- bgwAuslesen.ReportProgress(i)
- If line.Contains("Nachrichten in diesem Chat sowie Anrufe sind jetzt mit Ende-zu-Ende-Verschlüsselung geschützt. Tippe für mehr Infos.") = False Then
- If line.Contains("<Medien weggelassen>") = False Then
- Dim Datum = ChatHelfer.RegExMatch(line, "\d{2}(\.)\d{2}(\.)\d{2}")
- Dim Uhrzeit = ChatHelfer.RegExMatch(line, "(0.|[1][0-9]|[2][0-3])(\:)[0-5][0-9]((\:)[0-5][0-9]|)(\,[0-5][0-9]|)")
- Dim Absender = ChatHelfer.RegExMatch(line, "(-([^-])*:)").Replace("-", "").Replace(":", "")
- Dim NachrichtKopf = $"{Datum}, {Uhrzeit} - {Absender}:"
- If String.IsNullOrWhiteSpace(Datum) OrElse String.IsNullOrWhiteSpace(Uhrzeit) OrElse String.IsNullOrWhiteSpace(Absender) Then
- WhatsAppDataset.Nachricht.Last.Text &= $"{Environment.NewLine}{line}"
- Else
- WhatsAppDataset.Nachricht.AddNachrichtRow(Date.Parse(Datum), TimeSpan.Parse(Uhrzeit), Absender, line.Substring(NachrichtKopf.Length), row)
- End If
- End If
- End If
- Next
- row.IstAusgelesen = True
- End Sub
In der If-Abfrage ab Zeile #17 überprüfe ich, ob irgendwas von den Werten "leer" ist (und interpretiere es demnach nicht als neue Nachricht!) und füge es im Dataset der letzten Nachricht bei.
Da ich eben nun das Problem habe, dass er die Nachricht als neue Interpretiert, habe ich versucht das ganze mittels SubString auszulesen. Folgend die Funktion dafür:
VB.NET-Quellcode
- Shared Function SubStringMatch(ByVal Line As String, ByVal ss As SubString) As String
- Dim result As String = String.Empty
- Select Case ss
- Case SubString.Datum
- result = Line.Substring(0, 8)
- Case SubString.Uhrzeit
- result = Line.Substring(10, 5)
- Case SubString.Absender
- Dim absenderAnfang = Line.Substring(18)
- For i As Integer = 0 To absenderAnfang.Length
- If absenderAnfang(i).Equals(":"c) Then
- result = Line.Substring(18, i)
- Exit For
- End If
- Next
- Case SubString.Nachricht
- Dim NachrichtenKopf = $"{Line.Substring(0, 8)}, {Line.Substring(10, 5)} - {New Func(Of String)(Function() As String
- Dim absenderAnfang = Line.Substring(18)
- Dim r As String = String.Empty
- For i As Integer = 0 To absenderAnfang.Length
- If absenderAnfang(i).Equals(":"c) Then
- r = Line.Substring(18, i)
- Exit For
- End If
- Next
- Return r
- End Function).Invoke}: "
- result = Line.Substring(NachrichtenKopf.Length)
- End Select
- Return result
- End Function
Das bringt mir aber noch mehr Probleme, denn wenn die Nachricht der neuen Zeile weniger Zeichen hat als ich im SubString abfrage, stürzt es natürlich ab. Ich könnte es mit Try-Catch Abfangen,
String.Empty
zurückgeben und dann daran herausfinden, ob es eine neue Nachricht ist oder nicht. Aber das würde wieder in vielen If-Abfragen Enden, so meine Befürchtung.Das ist viel Text und rumgefasel von mir auf einmal, während ich den Text geschrieben habe kamen und gingen neue Ideen, deswegen könnte er ein wenig schwer zu verstehen sein. Ich bitte um Entschuldigung.
Wenn jemand eine Idee hat, wie ich das besser angehen könnte, so möge er hervortreten.
Einen angenehmen Rest-Abend wünsche ich.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „KingLM97“ () aus folgendem Grund: falschen Code kopiert