SPlit in 2-dimensionales Array

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von miles1980.

    SPlit in 2-dimensionales Array

    Hallo,

    ich habe ein kleines Problem und stehe auf einem schlauch....

    ich lese eine CSV Datei ein und möchte es in ein ARRAY rein schreiben, funktioniert auch fast nur das es 1-dimensional ist.

    Datei Aufbauf:
    LINE1. TEST1;TEST2
    LINE2: 213; 234


    VB.NET-Quellcode

    1. Dim sInput As String = File.ReadAllText(Datei)
    2. Dim stringArray = sInput.Split({";", Environment.NewLine}, StringSplitOptions.None)


    Ich würde es gerne so im ARRAY haben (0, 0) = TEST1, (0, 1) = TEST2, (1,0) = 213, (1,1) = 234.

    Was mache ich falsch?
    @miles1980 Wie wäre es so:

    VB.NET-Quellcode

    1. For Each line In IO.File.ReadLines(DEINE_DATEI)
    2. Dim parts() = line.Split(";"c)
    3. ' was mit parts tun
    4. Next
    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!
    Wenn ich For Each Line mache habe ich das selber Ergebnis :(

    Nachtrag habe es jetzt so gelöst!

    VB.NET-Quellcode

    1. Dim num_rows As Long
    2. Dim num_cols As Long
    3. Dim x As Integer
    4. Dim y As Integer
    5. Dim strarray(1, 1) As String
    6. 'Check if file exist
    7. If File.Exists(Datei) Then
    8. Dim tmpstream As StreamReader = File.OpenText(Datei)
    9. Dim strlines() As String
    10. Dim strline() As String
    11. strlines = tmpstream.ReadToEnd().Split(Environment.NewLine)
    12. 'Redimension the array.
    13. num_rows = UBound(strlines)
    14. strline = strlines(0).Split(";")
    15. num_cols = UBound(strline)
    16. ReDim strarray(num_rows, num_cols)
    17. 'Copy the data into the array.
    18. For x = 0 To num_rows - 1
    19. strline = strlines(x).Split(";")
    20. For y = 0 To num_cols
    21. strarray(x, y) = strline(y)
    22. Next
    23. Next
    24. End If


    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „miles1980“ ()

    @miles1980 Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Dim list = New List(Of String())
    2. For Each line In IO.File.ReadLines("C:\Temp\Test.csv")
    3. Dim parts() = line.Split(";"c)
    4. list.Add(parts)
    5. Next
    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
    Environment.NewLine ist stets mit Vorsicht zu genießen. Es ist nicht gewährleistet, dass jeder Zeilenumsprung des Systems als Environment.NewLine dargestellt wird. Wenn der StreamReader das nicht an sich anpasst, werden bspw. Zeilenumsprünge auf einem Standard-Windows-System ignoriert, die nicht vbCrLf (C#: "\r\n") entsprechen, d.h. vbLf, bzw. vbCr sind für diesen Fall keine gültigen Zeilenumsprünge, werden aber von anderen Betriebssystemen teilweise verwendet.
    ReadLine sollte diese Unterscheidung machen. Eine weitere Lösung wäre über IndexOfAny zum nächsten Chr(10) (das Char-Äquivalent zu vbLf) bzw. Chr(13) (das Char-Äquivalent zu vbCr) zu springen und den String über Substring von der letzten Fundstelle aus zu extrahieren. Hierbei würde sich die letzte Fundstelle zu 0 als Anfang des Strings oder entsprechend den Char-Kombinationen von Cr ud Lf ergeben (möglich sind halt Cr, Lf, CrLf und LfCr). Ob String.Split korrekt arbeitet, wenn man es auf ein String-Array von {vbCrLf, vbLf + vbCr, vbCr, vbLf} loslässt, habe ich nicht überprüft, wäre aber naheliegend und auch eine Option - hätte den Vorteil, dass man es nicht selbst implementieren muss.

    Übrigens folgende Empfehlungen zu deinem Code:
    - UBound durch <array>.Length - 1 ersetzen
    - Redim durch ein weiteres Array und Array.Copy ersetzen, für eindimensionale Arrays auf Array.Resize zurückgreifen
    - bei Split ";" (ist ein String) durch ";"c (ist ein Char) ersetzen
    Außerdem glaube ich, dass Option Strict nicht auf On ist, da die automatische Konvertierung von String zu Char (oder Char-Array? Ich glaube es war Char) sonst nicht unterstützt werden sollte. Option Strict On ist ein Muss, schau', sofern ich recht habe, mal nach, wie du das projekt- und Visual Studio-weit anschaltest.

    Die Anmerkung bzgl. Redim kannst du ggf. auch ignorieren, falls dir das zu viel Aufwand ist. UBound ist, wie ich vermute, aus Kompatibilitätsgründen von VB6, dem Vorgänger von VB.Net, mitgenommen worden, wie Redim auch. Da diese Funktionen nicht mehr dem noch stärker objektorientierten Ansatz entsprechen, wäre es eine Überlegung wert, sie zu ersetzen, da damit "reinerer" Code entsteht. Funktionieren tun sie ja trotzdem in vielen Fällen.
    UBound ist an sich überflüssig. Der einzige Fall, in dem UBound tatsächlich von Length - 1 abweicht, dürfte der sein, dass eine untere Grenze (der erste Wert des Arrays befindet sich an der unteren Grenze, die standardmäßig 0 ist) angegeben wird. Dieser Fall wird aber durch eine Unterscheidung der Typen gedeckt, d.h. ein Array mit unterer Grenze kann nicht einer Variablen zugewiesen werden, die keinen untere Grenze hat. Ansonsten gilt es wohl eh auf die Methoden von Array zurückzugreifen: GetLowerBound bzw. GetUpperBound. Aber wie gesagt, die braucht man, sofern man nicht auf dem Basistyp Array operiert, nicht.

    Was zudem immer eine Überlegung wert ist: Ich verzichte an beinahe wirklich jeder Stelle auf mehrdimensionale Arrays. Der Grund dafür ist, dass quasi das komplette Framework (soweit mir bekannt) ebenfalls darauf verzichtet und sie nur in den wenigsten Fällen tatsächlich unterstützt werden - die einzige Stellen, die mir bekannt sind, sind direkte Array-Operationen.
    Was ich stattdessen verwenden würde, wäre eine eigene Struktur, die ein eindimensionales Array kapselt und nach außen hin die Funktionalität eines mehrdimensionalen Arrays weiterreicht.

    Ich hoffe, ich überfahre dich jetzt nicht mit dieser Informationsflut. Falls doch, bist du wahrscheinlich noch nicht tief genug in die Materie vorgedrungen: Schau' dir das zu einem späteren Zeitpunkt einfach nochmal an, wenn du tiefer drin bist und nimm nur das grobe mit, das du verstehst (was hoffentlich mehr als 0 ist ;) ).

    Viele Grüße
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()

    DAs ist besser! ich muss das mal durch testen aber die ersten Tests waren TOP und deutlich schneller!! DANKE

    RodFromGermany schrieb:

    @miles1980 Sieh Dir mal dies an:

    VB.NET-Quellcode

    1. Dim list = New List(Of String())
    2. For Each line In IO.File.ReadLines("C:\Temp\Test.csv")
    3. Dim parts() = line.Split(";"c)
    4. list.Add(parts)
    5. Next
    vb-paradise.de/index.php/Attac…da193982a73eb7f26af34d539