CSV Import mit Bedingungen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Sub7evenHH.

    CSV Import mit Bedingungen

    Hi,

    ich möchte gerne eine CSV in ein Datagridview einlesen. Allerdings sollen direkt beim einlesen, alle Zeilen übersprungen oder entfernt werden, die in Spalte 5 weniger als 5 Zeichen enthalten. Hat da jemand eine Idee?


    Derzeitiger Code:

    VB.NET-Quellcode

    1. For Each line As String In System.IO.File.ReadAllLines(CSV)
    2. DatensätzeDataSet.Datenbank.Rows.Add(line.Split(","))
    3. Next


    Danke :)
    uih - da wird scheints mit Option Strict Off geproggt - bei mir jdfs. hat String.Split eine annere Signatur.
    @TE: Dringende Empfehlung: Visual Studio - Empfohlene Einstellungen
    Mit Strict Off ist vb.net nicht wirklich eine Objektorientierte Sprache.
    Das behindert dich allein schon dadurch, dass du nicht siehst, wie die Methoden wirklich ticken - wie gesagt: String.Split tickt ein bischen anders also wie du es hier verwendest.
    Muss ja noch nicht mal ein char-Array sein. Dim Fields = line.Split(","c) reicht auch.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    VaporiZed schrieb:

    Muss ja noch nicht mal ein char-Array sein
    Ich weiss, dass es funktioniert, habe aber nie verstanden warum.
    Die Signatur gibt es eigentlich nicht her.

    Deswegen habe ich jetzt mal hier nachgelesen:
    Because the separator parameter is decorated with the ParamArrayAttribute attribute, compilers will interpret a single character as a single-element character array.
    This is not the case for other String.Split overloads that include a separatorparameter; you must explicitly pass these overloads a character array as the separator argument.
    Geht also nur bei der Überladung mit nur dem Separator-Parameter.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Ich weiss, dass es funktioniert, habe aber nie verstanden warum.
    Die Signatur gibt es eigentlich nicht her.
    Die 1. Überladung ist die einzige, die die Separatoren als ParamArray akzeptiert. Alle anderen wollen ein "echtes" Array. Und da ein ParamArray ja so übergeben wird:

    VB.NET-Quellcode

    1. Private Sub Foo()
    2. Bar(1)
    3. Bar(1, 2, 3)
    4. End Sub
    5. Private Sub Bar(ParamArray x As Integer())
    6. Stop
    7. End Sub
    und beim 1. Aufruf eben in Bar ein Array mit einem Integer und beim 2. Aufruf mit 3 Integern erzeugt wird, ergibt sich die Funktionalität für Dim FinalArray = MyText.Split(";"c) und Co.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ja - ParamArray in vb.net ist ein bischen schmuddelig, aber praktisch:
    Übergibst du der Methode viele Parameter, so wird automatisch ein Array daraus gebildet und gut.
    Übergibst du ihr aber ein Array, so wird das auch genommen, und ebensogut.

    Obwohl ein Array ja eiglich ein annerer Typ ist.
    Streng genommen (und c# zB ist da streng) müsste er aus einem übergebenen Array ein Array-Array bilden, und garnet gut ist, weil es wird ein Array erwartet, kein Array-Array.
    @petaod

    Könntest du mir nochmal helfen mit einer Ergänzung?

    zu dem Code

    VB.NET-Quellcode

    1. ​For Each line As String In System.IO.File.ReadAllLines(CSV)
    2. Dim Fields = line.Split(",")
    3. If Fields.Count > 4 AndAlso Fields(4).Length > 4 Then DatensätzeDataSet.Datenbank.Rows.Add(Fields)
    4. Next


    Soll er zusätzlich die Bedingung haben = Wenn in Feld 6 der Wert TRUE steht, dann hinzufügen.
    Also so in der Art

    VB.NET-Quellcode

    1. For Each line As String In System.IO.File.ReadAllLines(CSV)
    2. Dim Fields = line.Split(",")
    3. If Fields.Count > 4 AndAlso Fields(4).Length > 4 And Fields(6).Text = "TRUE" Then DatensätzeDataSet.Datenbank.Rows.Add(Fields)Next


    Danke für die immer super Hilfe :)
    Hä? Was ist jetzt das Problem? Du hast doch schon den passenden Code selber geschrieben. Wenn man davon absieht, dass Fields(6).Text nicht funktioniert, da Fields ein String-Array ist und somit Fields(6) selber schon ein String, den Du auswerten kannst. Und da ein String keine Text-Property hat, funktioniert das natürlich nicht. Aber lass einfach das .Text weg und fertig.

    btw: Statt And nimm ein AndAlso. Und: Du arbeitest immer noch Option Strict Off
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Mir würde auch die Bedingung alleine langen. Also importiere die Zeile nur dann wenn in Spalte 6 "TRUE" steht. Ich hoffe jemand kann mir helfen :-/

    Edit:
    @VaporiZed
    DANKE :) Ja ich hab es nicht gecheckt dass es ein String ist... Option Strict on wurde nun auch aktiviert und ich bin am probieren. Danke danke danke danke Euch :)

    *Todeditierung rückgängig gemacht* ~NoFear23m

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Nofear23m“ ()

    Ich kapier's echt nicht, was Dir jetzt noch fehlt. Was passt denn nicht an Deinem Code:

    VB.NET-Quellcode

    1. For Each line As String In System.IO.File.ReadAllLines(CSV)
    2. Dim Fields = line.Split(","c)
    3. If Fields(6) = "TRUE" Then DatensätzeDataSet.Datenbank.Rows.Add(Fields)
    4. Next

    Das ist Dein Code. Und inhaltlich sehe ich kein Problem. Er macht das, was Du gern hättest. Ok, die Spalte 6 und Fields(6) - da kann man drüber streiten, da Fields(6) ja die 7. Spalte ist. Aber sonst? Ich blick's grad nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.