In DataGridView CSV einlesen und Spaltenanzahl automatisch festlegen

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von TonyB.

    In DataGridView CSV einlesen und Spaltenanzahl automatisch festlegen

    Hallo VB'ler Experten,

    zunächst einmal, ich bin jetzt nicht der Profi in diesem Fach. Ausser ein wenig VB Anwendungen in Excel, kenne ich mich nicht ganz so aus.

    Ich möchte folgendens Realisieren und benötige hier ein wenig Hilfe. In den letzten Tagen habe ich schon mehrfach verschiedene Seiten ergoogelt, bin nur zu keinem Ergebnis gekommen.

    Es wird eine CSV Datei in eine DataGridView eingelesen. Aus diesen Werten wird später ein Liniendiagramm erstellt, was mehr oder weniger auch funktioniert.

    Nun hänge ich an einigen Details fest. Es wird von Begin die Anzahl der Spalten in der DataGridView festgelegt. In den zu imortiernden CSV Dateien sind die Anzahl der Spalten jedoch nicht immer gleich.

    Nun dachte ich, man kann die Anzahl der Spalten in der CSV Datei ermitteln und später bei der Erstellung der DataGridView einfließen lassen.

    Mein Ansatz ist, es werden die Trennzeichen "," in der CSV gezählt, welche die Anzahl der Spalten ergibt.

    Es wird jedoch ein falscher Wert ausgegeben und ich weiß nicht warum. Was ist also in diesem Quellcode falsch?

    Bitte nicht über den Quellcode lachen hier ist bestimmt einiges nicht richtig, diesen habe ich aus verschiedenen Codeschnippsel zusammengesucht und angepasst, aber er funktioniert zumindest :)

    Danke


    VB.NET-Quellcode

    1. Public Class Form1
    2. Const ANZAHLSPALTEN As Integer = 30
    3. Const TRENNZEICHEN As Char = ","
    4. Private Sub ÖffnenToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ÖffnenToolStripButton.Click
    5. With OpenFileDialog1
    6. .Filter = "CSV Dateien (*.csv)|*.csv" 'Es werden nur CSV Dateien angezeigt
    7. .FilterIndex = 1
    8. .FileName = "" 'Der Filname bleibt leer
    9. .InitialDirectory = "" 'Kann eine Pfad Angabge enthalten
    10. .Title = "Datei auswählen ..." 'Zeigt den Titel des Öffnenfensters
    11. .ShowDialog() 'Der Dialog wird gestartr
    12. End With
    13. End Sub
    14. Private Sub OpenFileDialog1_FileOk(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    15. Dim Felder() As String
    16. Dim Zeile As String
    17. Dim DATEINAME As String = OpenFileDialog1.FileName
    18. Dim dt = New DataTable()
    19. Dim sr = My.Computer.FileSystem.OpenTextFileReader(DATEINAME, System.Text.Encoding.Default)
    20. '--------------------------------------------------------
    21. ' hier ist der Ausschnitt welcher zunächst über eine MsgBox
    22. 'die Anzahl der Trennzeichen ausgeben sollte
    23. Dim pfad As String = (sr.Read - 1)
    24. Dim dateinamesplit() As String = pfad.Split(TRENNZEICHEN)
    25. Dim index As Integer = UBound(dateinamesplit)
    26. Dim dateinamenew As Integer = dateinamesplit(index)
    27. MsgBox(dateinamenew)
    28. '--------------------------------------------------------
    29. For i As Integer = 1 To ANZAHLSPALTEN
    30. dt.Columns.Add("Spalte " & i) ' Spaltenüberrschriften erzeugen
    31. Next
    32. Do While (sr.Peek > -1) ' Dateiende abfragen
    33. Zeile = sr.ReadLine ' Eine Datenzeile lesen
    34. Felder = Zeile.Split(TRENNZEICHEN) ' Splitten in Felder
    35. Dim dr As DataRow = dt.NewRow ' Leere Datenzeile erstellen
    36. dr.ItemArray = Felder ' In DataRow speichern
    37. dt.Rows.Add(dr) ' Felder zur Datatable hinzufügen
    38. Loop
    39. DataGridView1.DataSource = dt ' DataTable in DataGridView zeigen
    40. InitializeDataGridView()
    41. End Sub
    verwende Microsoft.VisualBasic.FileIO.FileSystem.OpenTextFieldParser(String) As Microsoft.VisualBasic.FileIO.TextFieldParser

    Das gibt einen fertigen Parser für csv zurück. Da kann man auch die Trennzeichen dran einstellen, und ob Überschriften enthalten sind, und das Ding ermittelt die Spalten richtig (jdfs. wenn das csv ok ist)

    oder auch CSV mit OleDb einlesen. allerdings kann man damit die Trennzeichen nicht variieren, sondern ist drauf angewiesen, dass das csv mit der Trennzeichen-Einstellung der Registry übereinstimmt.