Laden...

Strings in 2d Stringarray zerlegen

Erstellt von JusJon vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.998 Views
J
JusJon Themenstarter:in
8 Beiträge seit 2018
vor 5 Jahren
Strings in 2d Stringarray zerlegen

Hallo , ich möchte eine Textdatei , die ich als Argument von der Befehlszeile übergeben bekomme in ein 2d Array aus einzelnen strings überführen. Meine Textdatei besteht aus mehreren Strings und ich möchte diese Strings in ihre Einzelteile zerlegen , sodass ich am Ende ein 2d Array aus Strings habe , welches ich später dann in ein Form zeichnen kann. Einen String in Einzelteile zu zerlegen habe ich mit der Split-Methode schon gemacht, aber anscheinend sehe ich in inzwischen den Wald vor lauter Bäumen nicht und bekomme die Umwandlung mit der zweiten for schleife nicht gebacken, sodass ich final wirklich ein 2d String Array habe .

Vielleicht kann mir jemand einen Denkanstoss geben.

Vielen Dank

286 Beiträge seit 2011
vor 5 Jahren

Ein bisschen Info über die Struktur der Textdatei wäre hilfreich zusammen mit etwas Code was du bisher gemacht hast. Und vor allem wie das Ganze am Ende aussehen soll (wonach sollen die strings zerlegt werden).

Sonst wäre meine Antwort einfach:



string[,] array = new string[,]
        {
            {"foo", "bar"},
            {"yo", "lo"},
        };

Fertig ist das 2d-Array.

2+2=5( (für extrem große Werte von 2)

J
JusJon Themenstarter:in
8 Beiträge seit 2018
vor 5 Jahren

die Textdatei sieht im Prinzip so aus:

****
*°°*
*°°*
****

ich möchte daraus später ein labyrinth zeichnen, bei dem die * die Wände darstellen und die ° den Weg.

Deshalb möchte ich die einzelnen Zeilen wieder in einzelne Strings zerlegen , damit ich es dann zeichnen kann.

Bisher hatte ich die Datei per StreamReader ausgelesen :

StreamReader reader = new StreamReader (@"textdatei");

string [] zeilen = reader.readline();

for(int i = 0, i< zeile.Length,i++)
{
      zeilen[i].Split(' ');
}

Wie gesagt, ich hab mich da irgendwie gedanklich festgefahren, sodass ich die einfachste Sache hier gerade nicht mehr durchblicke.

Hinweis von Abt vor 5 Jahren

Bitte Code Tags verwenden.
[Hinweis] Wie poste ich richtig?

T
461 Beiträge seit 2013
vor 5 Jahren

Hallo,

also um alle Zeilen auszulesen, kannst es dir wesentlich leichter machen:
https://msdn.microsoft.com/de-de/library/s2tte0y1(v=vs.110).aspx

Somit hast dann auch schon pro Zeile, die vertikale Position.

Mit String.Length hättest auch schon die horizontalen Positionen deines 2D Arrays.

Jetzt mußt es nur noch schaffen, diese Informationen in das Array zu stopfen 😉

(Zeile0 = y[0], Zeichen0 = x[0], usw...)

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

J
JusJon Themenstarter:in
8 Beiträge seit 2018
vor 5 Jahren

ja genau daran scheitert es ja gerade 😦... ich probier mal ein bisschen weiter. wenn ich`s dann hab ,werd ich es wohl niemals wieder vergessen... 😁

T
461 Beiträge seit 2013
vor 5 Jahren

Wieso denn?

  1. Du hast beide Längen H und V
  2. a) damit kannst du das Arraykonstrukt erstellen
  3. b) mit for dann zuerst die Zeilen, innerhalb dessen mit einer weiteren for dann die Anzahl der Zeichen einer Zeile durchschleifen (Schleifeniteration)
  4. c) die in der Hand liegenden Informationen in das Array mit den beiden aktuellen indexen stecken

Wenn du Probleme mit Array's hast, dann kann dir sicher das hier [,] helfen..

Schöne Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

J
JusJon Themenstarter:in
8 Beiträge seit 2018
vor 5 Jahren

So müsste es doch funktionieren.

string [] alleZeilen = File.ReadAllLines();
 
 for (int j = 0; j <= zeile; j++)
            {
                string[] einzelZeichen = alleZeilen[j].Split(' ');
                for (int i = 0; i <= spalten; i++)
                {
                    alleZeichen[i, j] = einzeleichen[i];
                }
            }
Hinweis von Abt vor 5 Jahren

Erneuter Hinweis auf

[Hinweis] Wie poste ich richtig?
Bitte die Code Tages verwenden.

16.835 Beiträge seit 2008
vor 5 Jahren

Ob etwas funktioniert kannst am aller Besten Du selbst heraus finden.
Ansonsten: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Beachte bitte meinen erneuten Hinweis.

T
461 Beiträge seit 2013
vor 5 Jahren

Zeige bitte den ganzen Block, wo auch zeile und spalten deklariert und zugeweisen werden.

Wozu brauchst du den Split?

Sieht das Textformat leicht so aus?:
* * * *
* ° ° *
* ° ° *
* * * *

Und wie Abt schon sagt, mit dem Debugger sieht man schon ne ganze Menge an reellen Daten, woraus man sich wieder ein ordentliches Bild machen kann.

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

4.939 Beiträge seit 2008
vor 5 Jahren

Zuersteinmal müßte der Code (syntax-)fehlerfrei sein, d.h. kompilieren.

Ich verstehe auch nicht, warum ein 2D-Array von Strings?! Ich denke entweder char[,] (bzw. char[][]) oder gleich string[] wäre passender.

T
461 Beiträge seit 2013
vor 5 Jahren

Ja Th69, darauf wäre ich noch eingegangen, hätte sogar einfache Integer oder eine Enum vorgeschlagen um die Unterschiede festzulegen.

Aber soweit ich das verstanden habe, konnte er nicht mal das Programm erstellen, wie auch du schon vermutet
(-> weil man ja nicht den ganzen Block sieht und ob er überhaupt dem entspricht wa wir hier sehen...)
hast...

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

C
224 Beiträge seit 2009
vor 5 Jahren

Anbei ein Beispiel wie man es machen könnte.
Bei der Map gibt es folgende Einschränkung:
*keine Leerzeichen. *keine leeren Zeilen. *Alle Zeilen müssen gleich lang sein.

Den Code kann man noch in vielen Bereichen verbessern. Aber für den Anfang sollte es reichen.

Die Map:


\**********
____*___**
\*_*_*_*___
\*_***_****
\*________*
\**********

Der Code:


        void Test()
        {
            string[] fileLines = System.IO.File.ReadAllLines(@"C:\test\map.txt");

            //Anzahl Zeilen prüfen:
            if (fileLines.Length < 1) throw new ArgumentException("Keine Daten");

            //Anzahl Spalten prüfen:
            for (int y = 0; y < fileLines.Length; y++)
            {
                if (fileLines[y].Length != fileLines[0].Length) throw new ArgumentException("Spaltendifferenz in Zeilenindex " + y.ToString());
            }

            //Map füllen:
            char[][] map = new char[fileLines.Length][];//Zeilen initialisieren
            for (int y = 0; y < map.Length; y++)
            {
                map[y] = new char[fileLines[y].Length];//Spalten der Zeile initialisieren
                for (int x = 0; x < fileLines[y].Length; x++)
                {
                    map[y][x] = fileLines[y][x];//Position füllen
                }
            }

            //Map anzeige vorbereiten:
            StringBuilder sb = new StringBuilder();
            for (int y = 0; y < map.Length; y++)
            {
                for (int x = 0; x < fileLines[y].Length; x++)
                {
                    sb.Append(map[y][x]);
                }
                sb.AppendLine();
            }

            //Map anzeigen:
            System.Diagnostics.Debug.Write("Anzeige über Debugger:\r\n\r\n" + sb.ToString());
            System.Console.Write("Anzeige über Konsole:\r\n\r\n" + sb.ToString());
            System.Windows.Forms.MessageBox.Show("Anzeige über Meldungsfenster von Windows:\r\n\r\n" + sb.ToString());
        }

Edit:
Man kann sich ja mal überlegen, wie man den Code verbessern kann. Hier geht so einiges.

T
461 Beiträge seit 2013
vor 5 Jahren

@CoLo, bist du @JusSon?

Wenn nicht, hast du ihm eine durchaus verbesserungswürdige Lösung dargeboten --> er muß nicht mehr genau nachdenken wie man das umsetzt --> lerneffekt ~33,33° %

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄