CSV Datensatz in Einzelsegmente aufteilen

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von csd2001.

    CSV Datensatz in Einzelsegmente aufteilen

    Guten Tag,

    Ich möchte mich erst einmal für die Aufnahme in dieses Forum bedanken!
    Ich habe schon vieles hier herausgefunden und stecke jetzt aber bei einer Sache total fest.
    Ich benutze Microsoft Visual Studio 2008 und ich habe eine „CSV“ Exportdatei mit mehreren Artikel und Preise die durch ein Semikolon getrennt sind.

    Auszug aus CSV: 64735627;JInko Solar Tiger Nero;856,70;19,00;1019,47;Solarmuodul;schwarz

    Ich möchte dieses Datensatz in seine einzelnen Bestandteile zerlegen. Ich habe es schon mit Split hier aus den Forum versucht, leider klappt es nicht. Vielleicht kann mir jemand von euch auf die Sprünge helfen. Ich bin ein Anfänger und habe noch nie etwas damit programmiert. Daher sind Fachbegriffe für mich Neuland und wenn mir jemand helfen kann, vielleicht einfach erklärt, Danke schon einmal im voraus.
    Willkommen im Forum.

    csd2001 schrieb:

    Ich habe es schon mit Split hier aus den Forum versucht, leider klappt es nicht.
    Was heißt das konkret? Compilerfehler? Datenmüll? Computer explodiert? Bitte Codeversuch und Ist-Ergebnis posten, sonst wird das hier Adventsspekulatiusbacken.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @csd2001 Ebenfalls Willkommen im Forum. :thumbup:
    Zunächst empfehle ich Dir, auf das Studio VS2022 umzusteigen, die alten Studion werden nicht mehr supportet.
    Dann nimmst Du den VisualBasic.TextFieldParser, da sollte es bei Dir gleich sofort wesentlich freundlicher aussehen:
    learn.microsoft.com/en-us/dotn…tfieldparser?view=net-7.0
    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!
    Danke erst einmal,
    ich habe noch MS Ultimate 2013 Visual Studio vorliegen, dass ist meine letzte Version und möchte eigentlich keine neuere Version kaufen da ich nächstes Jahr in Rente gehe.
    Auch die englischen Links helfen mir als alter Mann nicht weiter da ich in der Schule keinen englisch Unterricht genießen konnte.
    Vielleicht ist es doch möglich etwas für mich hier unter zu bringen.
    Dann bitte meine Frage beantworten und bei Mikrosaft die Sprache umstellen: Artikel auf deutsch
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Danke für den Hinweis mit der Sprachumstellung. Hat mich jetzt dazu animiert mal zu suchen wo das geht. Ich dachte bisher immer das ich zu blöd bin das zu finden. Am Ende der Seite habe ich nie geschaut, dort hatte ich es am wenigsten vermutet. Aber genau da ist es. :thumbsup:
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ich hab es manchmal auch einfach so gemacht, dass ich oben in der Adressleiste das /en-us/ auf /de-de/ umgestellt hab.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ok gut, ich versuche es mal so, hier mal ein Ausschnitt:

    Dim sstring As String = „8463578;PV-Module;brZu7;14.11.2022;General_Process_Technologies;(China)
    Dim testgesplittet() As String = sstring.Split(CChar(";"))
    MsgBox(testgesplittet(0))
    MsgBox(testgesplittet(1))
    MsgBox(testgesplittet(2))
    MsgBox(testgesplittet(3))
    MsgBox(testgesplittet(4))
    MsgBox(testgesplittet(5))
    MsgBox(testgesplittet(6))

    Das funktioniert schon einmal so, ich habe nur das Problem es in eine Variable zu übergeben und nicht in einer MsgBox.
    @csd2001 Du bekommst ein Array von Strings zurück.
    Weise es der Property .Lines einer (Tich)TextBox zu und Du siehst alle Deine Parts auf ein Mal:

    VB.NET-Quellcode

    1. Dim sstring As String = „8463578;PV-Module;brZu7;14.11.2022;General_Process_Technologies;(China)
    2. Dim testgesplittet() As String = sstring.Split(";"c) ' So wird in VB.NET ein Char dargestellt
    3. TextBox1.Lines = testgesplittet
    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!
    @RodFromGermanynullLeider bekomme ich in dieser Zeile einen Fehler: Dim testgesplittet() As String = sstring.Split(";"c)


    Was möchte ich mit den Splitting erreichen.
    Ich habe zwei Datensätze unterschiedlicher Länge. Hier nur ein Beispiel:
    CSV 1
    673645;PV-Module;176,50;Hartmann
    665533;Halterung;46,55;Schmidt
    387262;Schrauben;33,45;Hansen

    CSV 2
    673645;PV-Module;196,50;Hartmann
    665533;Halterung;49,55;Schmidt
    387262;Schrauben;33,45;Hansen

    Die Daten in der CSV 1 sollen auf Veränderungen in der CSV 2 geprüft werden. Es soll eine neue CSV 3 angelegt werden. Wenn wenn es in der ersten Zeile keine Änderung gibt wird die Zeile in CSV 3 gespeichert. Wenn es einen Unterschied gibt wie in Zeile zwei und drei (Preis) soll der Preis aus CSV 2 übernommen werden und dann die Zeile in CSV 3 gespeichert werden.

    Ich habe zwar das auslesen aus der CSV Datenbank herausgefunden, nur das splitten bekomme ich einfach nicht hin. Schön wäre es wenn mir dabei, auch gern für eine Bezahlung dabei helfen könnte. Es müsste dann aber entweder für Visual Basic 2008 oder Visual Studio 2013 sein, damit ich es weiter verarbeiten kann.

    csd2001 schrieb:

    Leider bekomme ich in dieser Zeile einen Fehler ...
    Nun - das war exakt der von Dir gepostete Code.
    Richtig sieht er so aus:

    VB.NET-Quellcode

    1. Dim sstring As String = "8463578;PV-Module;brZu7;14.11.2022;General_Process_Technologies;(China)"
    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!
    @RodFromGermanynull
    Ja aber auch mit dem ging es nicht, ich habe jetzt nur ein Beispiel der CSV gemacht um es kurz zu halten. Ich glaube nicht das die Länge etwas damit zu tun hat, oder?



    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „csd2001“ ()

    csd2001 schrieb:

    Ja aber auch mit dem ging es nicht
    Bei mir schon:
    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!
    @RodFromGermany

    Danke erst einmal für eure tolle Hilfe. Ich habe ein Problem, mit den Zeilen in der CSV Datei. Das Splitting der einzelnen Zeilen hat jetzt funktioniert , jetzt habe ich das Problem, dass die Sonderzeichen wie € nicht richtig eingelesen werden, da kommen drei kryptische Zeichen bei raus.
    Was fehlt hier noch, dass Encoding habe ich versucht, weiß aber auch nicht wie das eingebunden wird. Vielleicht bringt mich jemand auf die Sprünge.
    Mein letztes kleines Rechnungsprogramm hatte ich vor 25 Jahren VB 6 geschrieben. Hier mal mein Code.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim monat As String
    3. Dim datei As Integer
    4. Dim datei1 As Integer
    5. Dim i As Integer
    6. Dim zaehler As Integer = 0
    7. datei = 1
    8. datei1 = 2
    9. Dim BB As String
    10. Me.ListBox1.Items.Clear()
    11. FileOpen(datei, "f:\Victron.csv", OpenMode.Input)
    12. FileOpen(datei1, "f:\Victron1.csv", OpenMode.Append) 'Pr¸fen ob Datei vorhanden ist!
    13. Do
    14. monat = LineInput(datei)
    15. TextBox1.Text = monat
    16. Dim Text As String = TextBox1.Text
    17. Dim Trenner() As String = {";"}
    18. Dim Einzel() As String = Text.Split(Trenner.ToArray, StringSplitOptions.RemoveEmptyEntries)
    19. zaehler += 1
    20. Me.ListBox1.Items.AddRange(Einzel)
    21. Loop Until Zaehler = 10
    22. FileClose(datei)
    23. FileClose(datei1)
    24. For Each Litem In ListBox1.Items
    25. BB &= vbCrLf & Litem
    26. Next
    27. IO.File.WriteAllText("f:\Victron1.csv", BB)
    28. End Sub


    CodeTags gesetzt ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Oh ja. Das riecht gewaltig nach VB6.
    Wozu existiert datei1 in Deinem Code? Wird doch gar nicht verwendet.

    VB.NET-Quellcode

    1. Dim Trenner() As String = {";"}
    2. Dim Einzel() As String = Text.Split(Trenner.ToArray, StringSplitOptions.RemoveEmptyEntries)
    ->

    VB.NET-Quellcode

    1. Dim Einzel = Text.Split({";"c}, StringSplitOptions.RemoveEmptyEntries)


    Das Encoding kannst Du beim Einlesen der Datei angeben. Statt mit FileOpen zu arbeiten, bekommst Du die Dateizeilen so:

    VB.NET-Quellcode

    1. Dim DieDateizeilen = IO.File.ReadAllLines(Dateipfad, DeinEncoding) 'DeinEncoding wäre was vom Typ System.Text.Encoding
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed

    Danke einmal für deine Zeit und Mühe!
    Ja da war es für mich einfacher, heute ist es bestimmt besser wenn man damit umgehen kann. Aber mit fast 73 Jahren will der Kopf auch nicht mehr.
    Aber gut, gehört hier nicht hin. datei1 ist für das öffnen der Datei
    FileOpen(datei1, "f:\Victron1.csv", OpenMode.Append) 'Pr¸fen ob Datei vorhanden ist!

    Nun bin ich mit deinen Antworten wirklich überfragt was ich da in meinen VB6 Code :) ändern muss. Encoding UTF8 wird eingelesen.
    Dass Du dieses Konstrukt verwendest, um zu prüfen, ob die Datei vorhanden ist, habe ich mitbekommen. Dafür gäbe es alternativ:

    VB.NET-Quellcode

    1. If IO.File.Exists("f:\Victron1.csv") Then

    Beim Encoding musst Du schauen. Am besten öffnest Du die Datei im Windows-Editor. Da steht unten rechts das aktuelle Datei-Encoding, welches Du in Visual Studio verwenden musst, um dieselben Symbole zu erhalten.
    Bilder
    • Encoding.png

      5,83 kB, 408×212, 131 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed

    OK, die beiden ersten sind meine gewesen ist OK.
    Bei dieser weiß ich es. nicht genau.
    Dim DieDateizeilen = IO.File.ReadAllLines(, DeinEncoding)
    Dein Text DieDateizeilen was muss da stehen?

    Ich habe es so:
    Dim monat = IO.File.ReadAllLines("f:\Victron.csv", UTF8) <<<< Bekomme bei monat einen Fehler

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „csd2001“ ()