CSV in bestimmte Spalten einlesen (DGV)

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Holistiker.

    CSV in bestimmte Spalten einlesen (DGV)

    Hi!

    Ich versuche gerade verzweifelt eine CSV in eine Datagridview einzulesen. Ich möchte hier aus der CSV die Daten aber in unterschiedliche Spalten der DGV bringen.

    Beispiel CSV:

    Name,Nummer,Aktiviert
    Franz,22,Ja
    Hein,411,Ja
    Thomas,15,Nein

    Die Datagridview hat folgendes Layout:

    Aktiviert,Name,Nummer

    Ich möchte nun die CSV einlesen und die Spalte Aktiviert in die erste Spalte der Datagridview, die zweite Spalte in die zweite und die erste in die dritte einordnen.

    Der derzeitige Code sieht wie folgt aus:


    VB.NET-Quellcode

    1. ​Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim CSV As String
    3. Using dialog As New OpenFileDialog
    4. If dialog.ShowDialog() <> DialogResult.OK Then Return
    5. CSV = dialog.FileName
    6. End Using
    7. For Each line As String In System.IO.File.ReadAllLines(CSV)
    8. DataGridView1.Rows.Add(line.Split(","))
    9. Next
    10. End Sub


    Danke an Euch :)
    So ähnliche Fragen hattest Du schon...
    Beispiel 1: Bau dir eine Templist mit den Elementen der List of String aus dem line.Split auf, wobei Du nur die Elemente in der richtigen Reihenfolge adden müsstest. Dann die Templist ans DGV anhängen.
    Beispiel 2: Bau dir im Designer ein Dataset mit einer einzigen Tabelle, die den gewünschten Zielaufbau hat. Füge die Elemente aus dem line.Split einem jeweils neuen Tabel-Row korrekt zu und mach den Rest über Binding, wie es sich eigentlich eh gehören sollte. Wenn dir ein Dataset zu aufwenig ist und der jeweilige Datentyp String ist, kannst auch einfach eine Table im Code generieren.
    Und noch schnell Option Strict On dazuschalten, denn Zeile#11 ist es nicht.
    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.
    Ich bastel gerade an etwas sehr ähnlichem.
    Am einfachsten ist es, wie von @Dksksm beschrieben.
    Erstell dir ein DataSet mit einem DataTable und binde dieses an ein DGV

    Die einzelnen Einträge aus deiner csv erhälst du mittels split:

    VB.NET-Quellcode

    1. Dim TheReader As New StreamReader(csvPath, Encoding.Default)
    2. Dim sline As String = ""
    3. Do
    4. 'Splitten der einzelnen csv Zeilen
    5. sline = TheReader.ReadLine
    6. If sline Is Nothing Then Exit Do
    7. Dim words() As String = sline.Split(";"c) 'hier ist das ";" das csv Trennzeichen
    8. 'Daten wohin schreiben
    9. For i = 0 to words.Length - 1
    10. wasauchimmer = words(i)
    11. Next
    12. Loop

    In deinem csv Beispiel:
    Name,Nummer,Aktiviert
    Franz,22,Ja
    wäre im ersten durchlauf
    words(0) = Name
    words(1) = Nummer
    words(2) = Aktiviert
    im zweiten
    words(0) = Franz
    words(1) = 22
    words(2) = Ja
    usw.
    So kannst du deine Daten bequem ins DataSet schmeißen
    Ich mache das immer so:

    VB.NET-Quellcode

    1. Public Function Read_CSV(ByVal FileName As String) As DataTable
    2. Dim dt As New DataTable
    3. Dim st As New System.IO.FileStream(Filename, IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    4. Dim reader As StreamReader = New StreamReader(st, System.Text.Encoding.GetEncoding("Windows-1252"), False)
    5. Dim liste As New List(Of String)
    6. dt.Columns.Add("Aktiviert")
    7. dt.Columns.Add("Name")
    8. dt.Columns.Add("Nummer")
    9. reader.ReadLine()
    10. Do While reader.Peek >= 0
    11. Dim line As String = reader.ReadLine
    12. Dim r As DataRow
    13. r = dt.NewRow
    14. Dim linesplit() As String
    15. linesplit = Split(line, ";")
    16. r.Item("Aktiviert") = linesplit(0) 'Hier kannst du jetzt einfach mit der jweiligen Spaltennummer aus dem CSV zu den passenden Spalten im Datatable zuordnen
    17. r.Item("Name") = linesplit(1)
    18. r.Item("Nummer") = linesplit(2)
    19. dt.Rows.Add(r)
    20. Loop
    21. 'Und alles wieder schließen
    22. reader.Close()
    23. st.Close()
    24. Return dt
    25. End Function



    Das ganze könntest du dann folgendermaßen an ein Datagridview übergeben:

    VB.NET-Quellcode

    1. Datagridview1.Datasource = Read_CSV(C:\wasauchimmer.csv)