Probleme mit Zeilenumbrüchen bei aus EML-Dateien generierten CSV-Dateien

  • VB.NET (ASP)

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Probleme mit Zeilenumbrüchen bei aus EML-Dateien generierten CSV-Dateien

    Hi,

    ich versuche seit Tagen emls zu parsen und in eine CSV-Datei zu speichern. Funktioniert an sich auch recht gut, das einzige Problem ist, dass der TextBody in der CSV entsprechende Zeilenumbrüche hat, die ich partout nicht rausbekomme. Egal, welchen Replace (\r\n, VbCr, VbLf, VbCrLf, …) ich auch versuche. Im Internet finde ich auch nicht wirklich was, das mir noch helfen könnte.

    Das Problem dabei ist, dass beim Öffnen der CSV-Datei, die Spalte mit dem TextBody entsprechend auf mehrere Zeilen aufgeteilt wird.

    Ich habe schon versucht, während des Parsens zu ersetzen bzw. die CSV danach nochmal zu öffnen und alles zu ersetzen. Es ändert nichts am Endergebnis.

    Die Zeilenumbrüche sollen für die spätere Rückkonvertierung durch | ersetzt werden.

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Translating-IT schrieb:

    Das Problem dabei ist, dass beim Öffnen der CSV-Datei, die Spalte mit dem TextBody entsprechend auf mehrere Zeilen aufgeteilt wird.
    Poste mal so einen CSV-Ausschnitt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich muss dazu aus Datenschutzgründen leider alles schwärzen, aber ich denke, es ist ersichtlich, wo das Problem liegt …
    Es sind 6 Spalten, getrennt durch ~ (in der "ersten" Zeile rot umkreist).
    Bilder
    • CSV-problem.png

      29,27 kB, 1.895×2.312, 87 mal angesehen
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Translating-IT schrieb:

    aber ich denke, es ist ersichtlich, wo das Problem liegt …
    Nein.
    ersetze Inhalte durch Pseudo-Inhalte und poste einen Ausschnitt aus der CSV-Datei als CSV-Datei, nicht aber als Imabe :!:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ja, macht Sinn ^^. Was ich noch vergessen hatte anzumerken: In der CSV selbst kann ich über Notepad++ nach \r\n suchen und ersetzen. Aber ich bräuchte die Ersetzungen halt noch bevor die Datei (von einem Laien) geöffnet wird.
    Dateien
    • spam.csv

      (2,99 kB, 61 mal heruntergeladen, zuletzt: )
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    Wie erkenne ich Deine gewollten Nicht-Zeilenumbrüche?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es sind nur 2 Zeilen: Titel und Beispiel. In Excel bzw. Notepad++ werden mir aber 19 Zeilen angezeigt, wobei ich gerade bemerkt habe, dass sich beim Ersetzen ein Fehler in der 2. Zeile eingeschlichen hat und ein Teil in mehrer Spalten aufgeteilt wurde.
    Trenner für CSV ist ~
    Dateien
    • spam.csv

      (2,99 kB, 59 mal heruntergeladen, zuletzt: )
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Translating-IT schrieb:

    Trenner für CSV ist ~
    kommt 10 Mal vor.

    Translating-IT schrieb:

    Die Zeilenumbrüche sollen für die spätere Rückkonvertierung durch | ersetzt werden.
    Editiewree mal Deine letzte CSV von Hand, dass sie exakt so aussieht, wie Du es haben willst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    klar, 5 mal in der Titelzeile und 5 mal im Beispiel.

    So wie im Anhang soll sie aussehen
    Dateien
    • spam.csv

      (2,97 kB, 64 mal heruntergeladen, zuletzt: )
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    @Translating-IT Lies die Datei zeilenweise ein und setze sie zu einem String zusammen:

    VB.NET-Quellcode

    1. Imports System.Text
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim lines() = IO.File.ReadAllLines("D:\Temp\spam.csv")
    5. Dim sb = New StringBuilder()
    6. sb.AppendLine(lines(0))
    7. For i = 1 To lines.Length - 1
    8. sb.Append(lines(i))
    9. sb.Append("|")
    10. Next
    11. IO.File.WriteAllText("D:\Temp\spam2.csv", sb.ToString())
    12. End Sub
    13. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ich habe gerade zwei ähnliche Ansätze getestet …

    Bei deinem Ansatz wird leider darauf vergessen, dass es ja nicht nur 1 Beispielszeile gibt, sondern bis zu ein paar tausend. Somit ergibt das dann eine einzige Zeile mit den Daten von allen anderen Zeilen.

    Bei meinen wird zwar bei dem einen berücksichtigt, dass es nur 6 Felder je Zeile geben darf, leider wird aber aus irgendeinem Grund ein Teil des vorherigen Strings mit angehängt. Bei dem anderen gehe ich davon aus, dass die Zeile immer mit derselben Mailadresse beginnt, und alles danach zusammengehört, aber auch hier habe ich dasselbe Problem wie bei dem ersten Ansatz.

    2. Ansatz:

    VB.NET-Quellcode

    1. Dim newLines As List(Of String) = New List(Of String)()
    2. Dim lines() As String = File.ReadAllLines(WorkingFile)
    3. Dim temp As String
    4. For x As Integer = 0 To lines.GetUpperBound(0)
    5. If lines(x).StartsWith("imap@domain.xy") Then
    6. newLines.Add(temp)
    7. temp = lines(x)
    8. Else
    9. temp += "|" & lines(x)
    10. End If
    11. Next
    12. newLines.Add(temp)
    13. File.WriteAllLines(WorkingFile, newLines)


    Andererseits könnte ich nun deinen Ansatz hernehmen und entsprechend meinem 2. Ansatz immer gleich vor der Mailadresse splitten …

    EDIT: LOL, da wurde eine Variable beim Erstellen der CSV nicht zurückgesetzt, daher wird überall derselbe Text angehängt. Ok, damit ist dann alles gelöst:

    hier noch den 1. Ansatz:

    VB.NET-Quellcode

    1. Dim lines() As String = File.ReadAllLines(WorkingFile)
    2. Dim fieldsExpected As Integer = 6
    3. Dim newLines As List(Of String) = New List(Of String)()
    4. For i As Integer = 0 To lines.Length - 1
    5. Dim temp As String = lines(i)
    6. Dim fields As String() = temp.Split("~")
    7. While fields.Length < fieldsExpected AndAlso i < (lines.Length - 1)
    8. i += 1
    9. temp += "|" & lines(i)
    10. fields = temp.Split("~")
    11. End While
    12. newLines.Add(temp)
    13. Next

    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Translating-IT“ ()

    Translating-IT schrieb:

    Bei deinem Ansatz wird leider darauf vergessen,
    dass ich keine vollständige und belastbare Problembeschreibung / Aufgabenstellung habe und ich Diene Hausaufgaben nicht löse.
    Das musst Du allein tun, wir suchen Ansätze, damit Du dies tun kannst. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!