Mehrdimensionales Array mit Text aus externer Datei befüllen

  • VB.NET
  • .NET 4.5

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ThomasG82.

    Mehrdimensionales Array mit Text aus externer Datei befüllen

    Moin,

    heute ist leider das Brett vorm Kopf wieder riesig und ich komme nicht mehr weiter (und ja GOOGLE und MSDN und sonstiges hab ich gelesen und befragt aber es will nicht).

    Ich habe eine Textdatei:
    Sprache1; Abkürzung1
    Sprache2; Abkürzung2
    ...
    Dies will ich in eine Variable einlesen.
    Erst wollte ich List (Of String) nutzen, aber das ist ja eindimensional.
    Dann wollte ich ein Array nutzen aber ... ich habe dann alles hintereinander stehen, da ich beim Einlesen zwar den Zeilenumbruch hinbekomme aber irgendwie schaffe ich es nicht alles ordentlich zu teilen, sprich Spalte und Zeile.

    VB.NET-Quellcode

    1. Public Sprachauswahl As New List(Of String)
    2. 'Laden der Programmsprachen und Korrektursprachen
    3. Sprachauswahl.AddRange(My.Resources.sprachen_programm1.Split(vbCrLf))


    Kann mir da jemand mal auf die Sprünge helfen bitte?! :cursing: ;(
    Das Ergebnis in Sprachauswahl hab ich als Bild mal mit angehangen
    Bilder
    • Anmerkung 2019-12-03 151119.png

      57,6 kB, 792×477, 28 mal angesehen
    @ThomasG82 Was ist der Plan?
    Wäre das was für Dich:
    Programme mehrsprachig erstellen
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Danke @petaod - probiere ich gleich mal.

    @RodFromGermany - ne die Lokalisierung bzgl. der Sprache des Programmes ist nicht mein Problem bzw. der Hintergrund des Ganzen. Mir geht es darum, dass ich ein Auswahlmenü habe wo man Sprachen für ein zu installierendes Programm auswählen kann. Daher hab ich eine ewig lange Textdatei mit dem Land und dem dementsprechenden Ländercode dafür. Ich muss nur das alles erstmal als Variable online haben. Aufgrund der Auswahl in einer ComboBoxwird dann aus der Variable der Ländercode herausgefischt und weitergegeben.

    Update:
    @petaod - also Dictionary (Of String, String) ist genau das Richtige für mich, danke. Jetzt muss halt dummerweise trotzdem erstmal das ganze auftrennen. Denn wenn er die Textdatei My.Resources.sprachen_programm1 nimmt ist ja alles für ihn eine Zeile. (My.Resources.sprachen_programm1.Lenght ergibt 1)
    Muss es ja trotzdem erstmal auftrennen um die Zeilen zu bekommen und dann muss ich die 2 Werte, die sich ja in einer Zeile befinden auch nochmal auftrennen, damit er sie an der richtigen Stelle plaziert. Aber das sollte ich wohl hinbekommen mit 3 kleinen Hilfsvariablen. 8o

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

    So Problem gelöst und danke nochmal an @petaod
    Das Dictionary (Of String, String) war genau das Richtige.
    Nochmal kurz zwei Hilfsvariablen um erstmal aus einer Zeile viele Zeilen zu machen und dann die Werte in der Zeile trennen.

    Für den Interessierten hier der Code

    VB.NET-Quellcode

    1. 'My.Resources.sprachen_programm1 ist die Datei, alles hintereinander
    2. 'anschließend in TextAlsArray schon mal die Zeilen getrennt
    3. Dim TextAlsArray As String() = My.Resources.sprachen_programm1.Split(vbCrLf)
    4. For i As Integer = 0 To TextAlsArray.Length - 1
    5. 'Den Text in den Zeilen trennen bei einem ; und somit
    6. '2 Werte erhalten, die dann ins eigentliche Ziel kommen
    7. Dim GetrennterArray() As String = Split(TextAlsArray(i), ";")
    8. 'noch die Prüfung weil letzte Zeile ein vbLf enthält aber keinen Wert
    9. If GetrennterArray(0) <> vbLf Then Sprachauswahl.Add(GetrennterArray(0), GetrennterArray(1))
    10. Next
    @ThomasG82 Du kannst doch an vbLf splitten und hast im ersten Ritt alle Sprachen in je einer Zeile.
    In der zweiten Runde splittest Du am Semikolon und feddich.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ja könnte ich, aber so hab ich wenigstens das Ende und kann es gleich überprüfen um einen Überlauf zu verhindern.
    Man könnte auch sagen ich bin zu faul. ;) Aber Recht hast du.

    Vollzitat entfernt ~VaporiZed

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

    So ich hab mal noch ne andere Variante As New DataTable, muss die Daten ja noch weiter an eine ComboBox übergeben. Aber ich glaube, dass ich mit dem Dictionary (Of String, String) ja zum selben Ziel komme ... oder? Aber irgendwie hab ich es nicht hinbekommen.

    VB.NET-Quellcode

    1. Public sprachauswahl1 As New DataTable
    2. 'Laden der Programmsprachen
    3. Dim ZeilenSpPr As String() = My.Resources.sprachen_programm.Split(vbCrLf)
    4. sprachauswahl1.Columns.Add("ID", GetType(Integer))
    5. sprachauswahl1.Columns.Add("Land", GetType(String))
    6. sprachauswahl1.Columns.Add("Kurz", GetType(String))
    7. For i As Integer = 0 To ZeilenSpPr.Length - 1
    8. Dim Spalten() As String = Split(ZeilenSpPr(i), ";")
    9. If Spalten(0) <> vbLf Then sprachauswahl1.Rows.Add(i, Spalten(0), Spalten(1))
    10. Next
    11. 'Übergabe an Auswahlbox auf Tab ERWEITERTE EINSTELLUNGEN
    12. ComboBox_Hauptsprache.DataSource = sprachauswahl1
    13. ComboBox_Hauptsprache.DisplayMember = "Land"
    14. ComboBox_Hauptsprache.ValueMember = "Kurz"


    Kurz als ValueMember, weil "Land" dem Nutzer angezeigt wird und "Kurz" das ist womit später gearbeitet werden muss.

    Ist das eigentlich noch konform mit .NET 4.7?
    Ehm, was genau? Z#11 ist dank Split() auf jeden Fall mal VB6. Daher: Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Um das vbLf zu ersetzen, schau doch mal, ob die Zeilen ggf. mit Environment.NewLine getrennt sind. Der Split erfolgt dann so: Dim TextParts = DeinText.Split({Environment.NewLine}, StringSplitOptions.None)
    Verwendest Du die DataTable irgendwann weiter? Ließe sich ja als sinnvoller Datenspeicher nutzen. Nur eben nicht, wenn sie nur lokal in einer Sub vorliegt.
    Inwieweit ist für Dein Programm die Verwendung von Kurz als ValueMember besser als ID?
    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.
    Moin,

    so ich habe mal ein Teil meiner VB6 Krux entfernt und durch VB.NET konformen Teil ersetzt. Danke für den Hinweis - da liegt es wirklich daran, dass VB.NET trotzdem noch die alten Dinger kennt und nutzt.
    (Hab mir auch den Link zu Gemüte geführt - aber an OPTION STRICT ON [sonst selbstverständlich] muss ich noch knabbern, da hab ich Probleme mit meinen RegistryKey Variablen)

    Naja ich hab also mal die SPLIT() durch deinen Vorschlag .SPLIT() ersetzt - und siehe da meine Leerzeile ist auch gleich mit weg :) (das Leben kann manchmal so leicht und einfach sein)

    VB.NET-Quellcode

    1. Dim ZeilenSpPr As String() = My.Resources.sprachen_programm.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)

    und später in der Schleife

    VB.NET-Quellcode

    1. [Dim Spalten() As String = ZeilenSpPr(i).Split(";")

    Verspreche somit Besserung in der Nutzung .NET und Verbannung von VB6 :saint:

    Achso und ja ich kann auch mit ID arbeiten aber ich überlege ID wieder raus zu schmeißen, brauch sie ja eigentlich nicht da ich mit "KURZ" arbeite - ist nur das Denken aus Datenbanken was immer noch bei mir drin ist (wie Omi schon sagte - NIEMALS EIN EINTRAG OHNE EINDEUTIGE ID MEIN KIND)

    @petaod - muss mich nochmal bedanken für den Vorschlag mit Dictionary (Of String, String) bedanken. Hatte ja kurz den Versuch unternommen alles über DataTable zu realisieren, aufgrund der Möglichkeit die Tabelle in jeglicher Art und Weise anpassen zu können. Aber das hat ganz schnell im Chaos geendet (bin dabei auch auf einen Beitrag von @RodFromGermany gestoßen) wenn es darum geht typisierte DataSets zu benutzen oder halt so wie ich - nämlich nicht.
    Somit war dein Vorschlag genau der Richtige und wenn man sich ein bisschen umschaut in den Möglichkeiten und so wirklich versteht was Dictionary<TKey,TValue> Klasse bedeutet ist alles damit realisierbar. - Somit nochmals HERZLICHEN DANK :thumbsup:

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