Nach Split, Strings in Schleife erzeugen?

  • VB.NET

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

    Nach Split, Strings in Schleife erzeugen?

    Guten Morgen die Herrschaften,

    ich arbeite nach längerer Pause mal wieder mit .NET und komme gerade an einem Punkt nicht weiter.
    Vielleicht hat hier jemand den richtigen Tipp, wie ich das folgende Problem lösen könnte.

    Ziel:
    Erste Zeile einer CSV einlesen, die Zeile splitten und anschließend für jede Spalte bzw. den Inhalt der Spalte eine Variable generieren, welche den Namen des Spalteninhaltes trägt und den Wert der Stelle im Array bekommt. (Oh man, ich hoff ich hab es einigermaßen verständlich formuliert)

    Beispiel...

    Erste Zeile in der CSV:

    Quellcode

    1. Vorname;Name;Telefonnummer


    Diese Zeile soll nun so verarbeitet werden, dass später folgende Variablen automatisch erzeugt werden:

    Quellcode

    1. Vorname = "0"
    2. Name = "1"
    3. Telefonnummer = "2"



    Um das Ganze vielleicht etwas genauer darzustellen, hier mein Lösungsversuch, welcher natürlich nicht funktioniert:

    VB.NET-Quellcode

    1. Dim beispiel as String = "Vorname;Name;Telefonnummer" 'String mit der ersten Zeile der CSV
    2. Dim blub As Array = beispiel.Split(";") 'Die Zeile splitten und es entsteht:
    3. ' blub(0) = Vorname
    4. ' blub(1) = Name
    5. ' blub(2) = Telefonnummer
    6. For i = 0 To UBound(blub) 'Array durchlaufen - Für jede Position eine Variable anlegen die den Inhalt als Namen trägt und als Wert die Position
    7. Dim blub(i) = i 'Genau DAS funktioniert nicht... :/
    8. Next i
    9. 'Zum Verständnis der mögliche weitere Verlauf
    10. MsgBox(Vorname) 'Ausgabe = 0
    11. MsgBox(Name) 'Ausgabe = 1
    12. MsgBox(Telefonnummer) 'Ausgabe = 2


    Der Grund für die Aktion ist, dass ich für die weitere Verarbeitung immer die richtige Position der Spalte innerhalb der Quelle erhalte. Wenn sich also die Spalten der CSV ändern, soll die Ausgabe trotzdem gleich bleiben.


    Ich hoffe jemand hat da nen Tipp für mich. Ich steh nämlich gerade auf dem Schlauch. 8|

    Phenom schrieb:

    und anschließend für jede Spalte bzw. den Inhalt der Spalte eine Variable generieren, welche den Namen des Spalteninhaltes trägt
    Variablennamen generieren in Abhängigkeit des Inhalts einer auszulesenden Datei?
    Nö, das geht nicht, denn die Variablennamen musst Du ersinnen, wenn Du das Programm schreibst.
    ----
    Was genau funktioniert nicht?

    VB.NET-Quellcode

    1. For i = 0 To UBound(blub) - 1 ' hier minus 1
    2. blub(i) = i ' hier kein Dim
    3. Next i
    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!
    Hi RodFromGermany,

    danke dir für schnelle Antwort. Nun, was ich versuche ist, die erste Zeile der CSV zu lesen, um dann die Überschriften der Spalten entsprechend zuordnen zu können. Das heißt die Quelle - also die CSV-Datei - kann bezüglich der Anzahl von Spalten und der Anordnung unterschiedlich sein. Die Software soll aber immer die richtige Spalte finden und im weiteren Verlauf verarbeiten können. Ich versuche also, anhand der Spaltenüberschrift, die Position der Spalte in der CSV-Datei zu ermitteln. Für das Projekt im produktiven Sinne, wird es eine CSV-Datei sein, die immer über 60 Spalten hat. Darum ist das automatische Zuordnen durch die Überschriften die absolut bessere Lösung.

    Würde ich nun hergehen und zum Beispiel Textboxen nutzen, damit man vor einem CSV-Import die entsprechende Stelle der Spalte eingeben kann, dann funktioniert dies. Es wäre aber schöner, wenn die Anwendung die Positionen selbst - anhand der Überschriften - erkennen und dann ohne Interaktion des Nutzers die Daten verarbeiten kann. Genau da hänge ich eben fest. Die Funktion sollte quasi die Zeile splitten und anschließend in einer Schleife die Inhalte aus dem Array nehmen und damit dann Strings erstellen, die den jeweiligen Inhalt aus dem Array als Namen haben.

    Wenn also meinarray(0) das Wort Name als Inhalt hat, dann soll die Anwendung ein Dim Name as String = "0" durchführen. Sollte Name aber in meinarray(1) stehen, dann soll es ein Dim Name as string = "1" sein. Wenn sich also die Position der Spalte in der CSV ändert, soll die Funktion trotzdem die richtige Position finden. So könnte ich, wenn ich die Daten ins Datagrid schreibe, einfach beim adden die Strings nutzen und damit provozieren, dass immer die richtigen Spalten zugeordnet sind und an die richtige Stelle eingetragen werden.

    Alternativen gäbe es zwar, aber dann müsste ich für diese - eigentlich einfache - Funktion nen Berg an Code produzieren, was unübersichtlich wird und bei nem Fehler dann zu grauen Haaren führt.

    Phenom schrieb:

    Wenn also meinarray(0) das Wort Name als Inhalt hat, dann soll die Anwendung ein Dim Name as String = "0" durchführen.
    Das geht nicht.
    Dim Name as String = "0" musst Du zur Entwicklungszeit vorgeben, Du willst es jedoch zur Laufzeit umgesetzt haben. .NET funktioniert so nicht.
    Was Du allerdings machen kannst, die Namen in der richtigen reihenfolge in eine List(Of String) ablegen, da ist der Feldindex gleichzeitig der Spaltenindex in der CSV.
    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!
    Mensch, ich bin ja auch doof! War leider ein Denkfehler von mir.
    Die Datensätze kann man ja auch anhand der Spaltenüberschriften aus dem Grid holen.

    VB.NET-Quellcode

    1. Dim myGrid = DataGrid1 'Name des Datagrids
    2. Dim trennzeichen As String = ";" 'Trennzeichen in der CSV
    3. If OpenFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
    4. Dim dt As New DataTable()
    5. Using sr As New StreamReader(OpenFileDialog1.FileName, System.Text.Encoding.Default)
    6. While Not sr.EndOfStream
    7. Dim currentline As String() = sr.ReadLine().Split(New String() {trennzeichen}, StringSplitOptions.None)
    8. If dt.Columns.Count = 0 Then
    9. For i As Integer = 0 To currentline.Length - 1
    10. dt.Columns.Add(currentline(i))
    11. Next
    12. Else
    13. dt.Rows.Add(currentline)
    14. End If
    15. End While
    16. sr.Close()
    17. End Using
    18. myGrid.DataSource = dt
    19. Else
    20. MsgBox("Bitte eine CSV-Datei auswählen!", MsgBoxStyle.Exclamation, "Hinweis")
    21. End If


    Dies liest die CSV-Datei ein und schreibt alle Spalten mit entsprechender Überschrift in das Grid.
    Anschließend kann man die jeweiligen Inhalte mit Angabe des Spaltennamens und der Row auslesen.
    Zum Beispiel beim SelectionChanged-Event des Datagrids (also wenn man eine Zeile anklickt)

    VB.NET-Quellcode

    1. With DataGrid1
    2. If .SelectedRows.Count > 0 Then
    3. TextBox1.Text = .SelectedRows(0).Cells("SPALTENNAME1").Value.ToString
    4. TextBox2.Text = .SelectedRows(0).Cells("SPALTENNAME2").Value.ToString
    5. End If
    6. End With


    Manchmal steht man echt auf dem Schlauch... :D
    Trotzdem ein Danke an RodFromGermany für die Denkhilfe.