Announcement

Collapse
No announcement yet.

CSV ab 2.Zeile in DGV einlesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CSV ab 2.Zeile in DGV einlesen

    Guten Abend,
    ich lese in ein DataGridView eine CSV-Datei mit folgendem Code ein:
    [highlight=vbnet]
    Dim input As String = txtInput.Text
    Dim enc As System.Text.Encoding = System.Text.Encoding.GetEncoding(1252)

    Try
    Using Parser = New FileIO.TextFieldParser(input, enc)
    With Parser
    .TextFieldType = FieldType.Delimited
    .Delimiters = New String() {txtDelim.Text}
    .TrimWhiteSpace = True

    End With

    Do Until Parser.EndOfData
    Dim Col = Parser.ReadLine
    Dim data() As String = Col.Split(txtDelim.Text)
    grid1.Rows.Add(data)
    Loop
    End Using
    Catch ex As Exception
    End Try
    [/highlight]
    Allerdings möchte ich - je nachdem, ob die csv-Datei Kopfzeilen enthält oder nicht - die CSV selbst erst ab der 2. Zeile(also ohne Kopfzeilen) ins DGV einlesen. Wie ist das am einfachsten zu bewerkstelligen? Hab heut schon stundenlang probiert, aber irgendwie seh ich den Wald vor lauter Bäumen nicht...

    Irgendwelche Tips/Denkanstöße?

    Danke!!

  • #2
    Ein Parser.ReadLine der Schleife voranstellen um die Daten ins leere laufen zu lassen oder einfach in der Schleife auf die LineNumber checken und die erste ignorieren.

    Wen deine Frage eher darauf abzielt rauszufinden ob die erste Zeile Header oder Daten enthält dann gibt es da keinen Automatismus. Vermutlich würde so eine Verfahren auch in 50% der Fälle das Falsche erraten und somit unnütz sein.

    Comment


    • #3
      Nein, kein Automatismus, das muss der User schon selbst entscheiden und dementsprechend eine Checkbox anhaken. Gibts denn irgendeine Möglichkeit, dem Parser eine Startzeile mitzugeben, mit er er anfangen soll? Oder wie kann ich an Hand der LineNumber die Zeile ignorieren?

      Comment


      • #4
        In der Schleife nur dann die gelesene Daten splitten und dem Grid zuweisen wenn nach dem ReadLine die LineNumber > 1 ist.

        Edit: Wieso benutzt du eigentlich den TextFieldParser wenn du dann doch einfach die Datei zeilenweise einliest und selbst splittest? Gefühlt verwendest du 0 Features des TextFieldParser die über ein simples File.ReadAllLines hinausgehen.


        Comment


        • #5
          Hallo Ralf,
          ich hab es jetzt mit
          [highlight=vbnet]
          Do Until Parser.EndOfData
          Dim Col = Parser.ReadLine
          Dim data() As String = Col.Split(txtDelim.Text)
          If Parser.LineNumber > 2 Then
          grid1.Rows.Add(data)
          End If
          Loop
          [/highlight]
          versucht, aber so richtig glücklich bin ich damit. Es fehlt nämlich jetzt die letzte Zeile der Datei, da deren LineNumber mit -1 ausgegeben wird und das eben kleiner als 2 ist
          Was wäre denn in diesem Fall die richtige Verwendung des Parser? Ich bin für jede elegantere Lösung zu haben

          Comment


          • #6
            Eleganz liegt im Auge des Betrachters. Da du einfach die Daten einliest und einfach splittest ohne dazu den Parser zu benutzen würde ein simples File.ReadAllLines auch einfach alle Zeilen liefern. Mit minimlaen Aufwand wird man dann auch noch die erste Zeile los und bekommt das ganze gesplittet.

            Dein Daten als gesplitte Liste bekommst du einfach so

            [Highlight=VB.Net]System.IO.File.ReadAllLines("test.csv").Skip(1).Se lect(Function(x) x.Split(New Char() {","}))[/Highlight]

            Comment


            • #7
              Das Ganze auf eine Zeile geschrumpft würde schonmal gut aussehen, nur wie bekomme ich die Daten dann ins Grid?

              Comment


              • #8
                Ich würde per LINQ noch 'nen schönen Typen aus dem Array machen und dem dem Grid zuweisen dann hast du auch sinnvolle Spaltennamen und kannst normales DataBinding verwenden.

                [Highlight=VB.Net]
                grid1.DataSource = (From x In (From d In System.IO.File.ReadAllLines("test.csv") Skip 1
                Select d.Split(New Char() {","}))
                Select Spalte1 = x(0),
                Spalte2 = x(1),
                Spalte3 = x(2),
                Spalte4 = x(3)).ToList[/Highlight]

                Immer noch ein Einzeiler aber ein wenig hübsches formatieren ist besser

                Comment


                • #9
                  Funktioniert perfekt, vielen Dank!!

                  Comment

                  Working...
                  X