Das Ergebniss eines String.split in mehreren Array hinzufügen

  • VB.NET

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Hutti.

    Das Ergebniss eines String.split in mehreren Array hinzufügen

    Hallo Leute,

    Ich habe einen Text der so aussieht:
    12345678;3;11.2017;5,3
    23456789;6;01.2016;5,6
    und so weiter.

    Nun soll die Zahlen vor dem ersten ";" in ein Array z.B PZN() und die Zahlen bis zum zweiten ";" in ein anderes Array z.B. Namens Menge()
    mit String.Split kann beim ";" trennen aber wie mache ich das, das es in unterschiedlichen Arrays hinzugefügt wird?

    hat einer eine Idee?

    Danke
    Ich halte hier Arrays für fehl... Ein Array will zur Definition wissen wie groß es ist.
    Mir scheint als wüsstest du das aber nicht.

    Hierfür würde sich eher das Erstellen einer kleinen Klasse eignen und dann ein List(Of Klasse)..
    Oder sogar ne schlichte DataTable!? Ist ja wie es scheint ne Tabelle.

    Mich würde interessieren wieso unbedingt ein Array? eher gesagt... Wieso mehrere...
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Jou.

    Jacky1804 schrieb:

    unterschiedlichen Arrays hinzugefügt wir
    Probier mal dies:

    VB.NET-Quellcode

    1. Private PZN As New List(Of String)
    2. Private Menge As New List(Of String)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim txt = "12345678;3;11.2017;5,3"
    5. Dim parts() = txt.Split(";"c)
    6. PZN.Add(parts(0))
    7. Menge.Add(parts(1))
    8. End Sub
    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!
    Ich täte es zum Üben auch mal so:

    ACHTUNG: EDITIERT!!! Hatte nen Fehler in den Propertys durchs kopieren XD

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim lstZeile As New List(Of _Zeile)
    3. Using sr As New IO.StreamReader("C:\Temp\Test.txt")
    4. Do While Not sr.EndOfStream
    5. 'Lesen der Daten und erstellen von neuen Einträgen
    6. lstZeile.Add(New _Zeile(sr.ReadLine.Split(";"c)))
    7. Loop
    8. End Using
    9. 'Testweise durchlaufen aller "Werte" und Message der PSN wnen Menge > 5
    10. For Each zeile In lstZeile
    11. If zeile.Menge > 5 Then MessageBox.Show(zeile.PSN)
    12. Next
    13. End Sub
    14. Private Class _Zeile
    15. 'Lokale Variablen erstellen
    16. Private _PSN As String
    17. Private _Menge As Integer
    18. Private _Datum As Date
    19. Private _Gewicht As Decimal
    20. 'Erstellen einer neuen "_Zeile" mit Übergabe eines Datenarrays
    21. Public Sub New(item() As String)
    22. _PSN = item(0)
    23. _Menge = Integer.Parse(item(1))
    24. _Datum = Date.Parse(item(2))
    25. _Gewicht = Decimal.Parse(item(3))
    26. End Sub
    27. 'Erstellen einer neuen "_Zeile" mit Angabe der einzelteile
    28. Public Sub New(ByVal PSN As String, ByVal Menge As Integer, ByVal Datum As Date, ByVal Gewicht As Decimal)
    29. _PSN = PSN
    30. _Menge = Menge
    31. _Datum = Datum
    32. _Gewicht = Gewicht
    33. End Sub
    34. 'Propertys zum lesen und ändern der Daten:
    35. Property PSN As String
    36. Get
    37. Return _PSN
    38. End Get
    39. Set(value As String)
    40. _PSN = value
    41. End Set
    42. End Property
    43. Property Menge As Integer
    44. Get
    45. Return _Menge
    46. End Get
    47. Set(value As Integer)
    48. _Menge = value
    49. End Set
    50. End Property
    51. Property Datum As Date
    52. Get
    53. Return _Datum
    54. End Get
    55. Set(value As Date)
    56. _Datum = value
    57. End Set
    58. End Property
    59. Property Gewicht As Decimal
    60. Get
    61. Return _Gewicht
    62. End Get
    63. Set(value As Decimal)
    64. _Gewicht = value
    65. End Set
    66. End Property
    67. End Class


    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

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

    Eine Liste ist eine Liste...
    Die bietet dir ganz andere Funktionen als ein Array.
    Mach mal in Visualstudio die Hilfe für nen Array und für ne Liste auf... Dann siehst es doch.

    Und wie ich schon schrieb... Ein Array muss beim Definieren auf eine Größe begrenzt werden.
    Eine Liste ist "variabel"
    Genauso kannst du nicht nur von STRING ne Liste machen, sondern von allem...
    Wie in meinem Beispiel von Klassen.

    Dann kannst auch direkt in der Klasse suchen und so weiter und sofort.

    Alleine "MENGE" als String zu verarbeiten ist ein Widerspruch... Ne Menge ist ne ZAHL und kein Text!
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D

    Jacky1804 schrieb:

    wie mache ich das wenn ich mehrere Zeilen habe?
    Das entsprechend organisieren und für jede Zeile den Code aufrufen.
    Mach Dir ne Klasse, wie es @MemoAnMichSelbst gezeigt hat.
    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!
    Für dich als Entwickler bietet sie einfach ganz andere Methoden...
    Ich empfehle mal einfach zu schauen was dir die Intellisense vorschlägt... Dann siehst du den riesen Unterschied.
    Listen sind eine schöne Erfindung.

    Ich denke aber dass bei dir sogar eine Datatable und wenn es aus anderen Quellen noch mehr Daten gibt, sogar ein richtiges Dataset sinnvoller wäre.
    Ist interessant, nicht all zu schwer (ist ja nur ne Tabelle...) zu verstehen und bietet halt für das Nutzen der Daten noch weit mehr Komfort.
    Gerade wenn es um das Verknüpfen von Inhalten mehrerer Tabellen geht.

    Aber um wirklich sinnvolle Antworten zu geben, müsste erst einmal der wirkliche Sinn hinter dem Ganzen genannt werden. Oft ist es ja so, dass sich hinter so kleinen "Verbasteleien" größere Zusammenhänge stecken, die man mit etwas Wissen über zur Verfügung stehende Funktionen ganz anders angehen würde und meist weit "simpler".
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    Es war einmal ein kleiner Bär... der wollte eine Geschichte hörn... Da erzählte ihm seine Mutti:
    ... Nun solltest es selber wissen. :'D
    Jou.
    @Jacky1804 Vielleicht beschreibst Du mal die Aufgabe / das Problem, ohne Bezug auf eine mögliche programmtechnische Umsetzung zu nehmen, denn damit verbaust Du Dir mögliche gute Lösungen.
    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!
    Erst mal Danke an alle

    meine Aufgabe:
    ich soll 2 Inventur Dateien vergleichen.
    Es sind Textdateien mit den Infos über PZN; Menge; Verfalldatum und Verkaufspreis.
    Die Angeben sind meist mit einem ";" getrennt es könnte aber auch eine Leertaste sein.
    Eine Datei ist der soll Lagerbestand laut letzter Sicherung unseres Programms (vorerst denke ich mir den aus) die andere ist der Lagerbestand laut Inventur.
    Ich versuche jetzt erst mal die Dateien in zwei mehrdimensionalen Arrays gesplittet hinzuzufügen. Ihr habt schon recht mehrere einzelne Arrays machen keinen Sinn.
    Würde auch eine mehrdimensionale List(Of T) gehen? Wäre das Sinnvoll?

    Gruß Jacky

    Jacky1804 schrieb:

    Wäre das Sinnvoll?
    Eine Zeile Deiner Dateien ist ein Datensatz in einer Tabelle.
    Mit diesen Datensätzen kannst Du gut arbeiten.
    ====
    Leerzeichen als Separator:
    Du kannst auch an mehreren Zeichen splitten. Ist jedoch gleichzeitig gesichert, dass das Leerzeichen nicht innerhalb eines "normalen" Strings vorkommt, als Namensbestandteil z.B.?

    VB.NET-Quellcode

    1. Dim txt = "bla;yy xx;zz"
    2. Dim parts() = txt.Split(New Char() {";"c, " "c})
    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!
    nein.
    Was du da an Dateien hast, scheint ähnlich csv-Format zu sein.
    Bei csv ist eine Zeile ein Datensatz, das heisst, die enthaltenen Daten gehören zusammen.

    Daraus folgt, du musst halt eine Datensatz-Klasse coden, und davon eine Liste anlegen.
    Dann kannst du die Datei in diese Liste einlesen, und hast die Datensätze handhabbar.
    Zerstückel das blos nicht in viele Arrays oder viele Listen.



    egal - anderer Ansatz, überhaupt anderes Verständnis:
    Würde es reichen, du liest einfach die Zeilen komplett ein, und vergleichst die?
    @RodFromGermany
    Es ist sicher, das das Leerzeichen nur als Trennzeichen gilt.

    @ErfinderDesRades
    Die Zeilen sind immer Unterschiedlich lang, das wäre doch ein Problem wenn ich die ganze Zeile vergleichen will oder

    @beide
    ich habe bisher noch nicht Datensätzen gearbeitet, daher weiß ich mit Dataset oder Datatable noch nichts anzufangen. könnte mir einer von euch einen Beispielcode zeigen, also keinen für C&P sondern für jetzt verstehe ich das
    ich habe noch mal eine frage zu mehrdimensionalen Arrays:
    Dim bla(x,y)
    x ist doch die Anzahl der reihen und y die anzahl der Spalten oder?
    wenn ich also eine zahl in der ersten reihe in der ersten spalte speichern will mach ich das so?:
    bla(0,0) = 1
    oder??
    Aber vorsicht! x als Variable ist gewöhnlich ein horizontaler Zähler, und y zählt vertikal. Mit diesbezüglichen Verwechslungen schafft man blitzgeschwind ordentlich Verwirrung

    Also wäre besser, du schriebest:

    VB.NET-Quellcode

    1. Dim bla(y, x)
    Dann ist x die Anzahl der Spalten (horizontal), und y die der Zeilen.

    Aber - wurde schon gesagt - in Bezug auf dein Problem wäre es die schlechteste Lösung ever, wenn du zu einem 2D-Array griffest.
    Danke
    eine Frage nur wie lese ich sowas aus?
    console.writeline(??)

    @ErfinderDesRades
    Ich bin willig was zu lernen, daher möchte ich zuerst selber was zusammen basteln.
    Den fertigen Code stell ich dann rein.
    Du könntest ja so lieb sein deine Variante zu machen und diese reinstellen wenn meiner drin ist. so kann ich vergleichen und lernen wie es besser wäre.
    Dennoch hätte ich vorher etwas eigenes gemacht und nicht nur C&P benutzt.