C# Einlesen einer Textdatei, Zeichenweise in ein 2D Array[zeile,spalte] ?

razzy

Lieutenant
Registriert
Sep. 2009
Beiträge
1.001
Guten Abend zusammen,

ich habe schon gefühlt das halbe Internet durchforstet und finde einfach keinen richtigen Ansatz.

Folgendes Szenario:

Ich habe eine Textdatei mit folgendem Inhalt:

Code:
20
55
12345678901234567890
12345678901234567890
12345678901234567890
12345678901234567890
...
...

Die erste Zeile sagt mir, wieviele Spalten ich habe, die 2. die Zeilen.

Ich möchte jetzt gerne jedes einzelne Zeichen in ein passendes Array haben, und dachte mir, es geht am einfachsten mit einem 2D Array, sprich array[zeile][spalte].
Auf das 2D Array kam ich, da ich später kontrolliert die einzelnen Buchstaben ausgeben möchte.

Ich meine ich hab es bisher geschafft das ganze in ein Array zu bringen, Byteweise eindimensional.

Code:
           FileStream fs = new FileStream(Textdateipfadvariable, FileMode.Open);
            byte[] puffer = new Byte[fs.Length];
            fs.Read(puffer, 0, (int)fs.Length);

            for (int i=0; i<fs.Length; i++)
            {
                Console.WriteLine(Convert.ToChar(puffer[i]));
            }
            fs.Close();

            Console.ReadKey();


Hättet ihr evtl einen Lösungsansatz, damit mein Knoten im Kopf entfernt wird :D ?

Danke
 
Zuletzt bearbeitet:
Hi,

lies doch einfach Zeile für Zeile, Spalte für Spalte und fertig? Wieso liest du es byteweise? Zwei Schleifen, eine für die Zeilen, eine für die Zeichen pro Zeile, fertig?

VG,
Mad
 
Hast du dazu evtl. ein kleines snippet ?
Mir fehlt gerade echt der Ansatz dazu.

Danke schon mal für deine Idee :)
 
pseudocode:
Code:
spalten = readLine()
zeilen = readLine();

array[spalten][zeilen];

lines = readAllLines();

for (y = 0; y < lines.length; y++) {
   for (x = 0; x < lines[i].length; x++) {
      array[x][y] = lines[y][x];
   }
}


ansonsten könntest du das ganze auch einfach als ein großer string einlesen und mit etwas mathe an die richtige position kommen, vorher jedoch noch alle Zeilenumbrüche entfernen oder in der Rechnung mit "(spalten + 1)" berücksichtigen:

Code:
index = y * spalten + x

die umgekehrte Rechnung wäre:

Code:
x = index % spalten
y = floor(index / spalten)
 
Zuletzt bearbeitet:
Oder wenn du davon ausgehen kannst, dass die Dateien stimmen (also Zeilen und Spalten) kannst du das auch so machen:
Dafür dürfen dann aber in den ersten beiden Zeilen nicht die Zeilen und Spaltenanzahl stehen!
Code:
var data = File.ReadAllLines("meineDatei.txt").Select(x => x.ToCharArray()).ToList();
und um dann die Dimensionen zu bekommen, kannst du folgendes machen:
Code:
var rows = data.Count;
var columns = data.Min(x => x.Length);

@Bagbag
da index und zeilen int seien sollten, kann man sich das floor auch sparen
 
In C# ja, aber bspw. in JavaScript nicht.
Und in meiner Pseudocodesprache auch nicht :)
 
Mir ist grad noch aufgefallen, dass deine Ermittlung von y über den Index falsch ist. Da musst du auch durch spalten teilen.

Beispiel: 2 Reihen a 20 Spalten
Index 28:
x = 28%20 = 8
y = 28 / 2 = 14
sollte
y = 28 / 20 = 1
sein
 
Du hast recht. Es war schon spät gestern :D.
 
Hallo zusammen,

danke für die Tipps.

Ich hab mich den letzten Tag ein wenig noch mal mit dem ganzen beschäftigt und es jetzt folgendermaßen gemacht:
  • 2D Array brauch ich nicht mehr.
  • Ausgabe erfolgt mit den einzelnen Buchstaben und den Informationen aus der Datei (Zeilen/Spalte)

Code:
        static void Main(string[] args)
        {
            string[] inhalt = File.ReadAllLines(datei);                                 //Zeilenweises einlesen der Maze-Datei

            int spalten = Convert.ToInt32(inhalt[0]);                                       //Einlesen der Spalten
            int zeilen = Convert.ToInt32(inhalt[1]);                                        //Einlesen der Zeilen

            inhalt = inhalt.Where(w => w != inhalt[0] && w != inhalt[1]).ToArray();         //Löschen der spalten/zeilen Infos aus dem Array

            string labyrinth = string.Join("", inhalt);                                     //einzelner string wird mit dem arraystring befüllt

            string[] buchstaben = new string[labyrinth.Length];                             //einzelne Buchstaben werden in string array geschrieben
            for (int i = 0; i < labyrinth.Length; i++)
            {
                buchstaben[i] = Convert.ToString(labyrinth[i]);
            }

            Console.WriteLine("\n");
            Console.WriteLine("Ausgabe einzelner Buchstaben als Labyrinth\n");
            int y = 0;                                                                      //einfache Zählervariabel

            for(int i = 0; i < zeilen; i++)                                                 //Ausgabe des Labyrinths in 13 Zeilen á 19 Spalten
            {
                for (int x = 0; x < spalten; x++)
                {
                    Console.Write(buchstaben[y]);
                    y++;
                }
                Console.WriteLine();
            }

            Console.ReadKey();
        }

Hier wird sicher noch Optimierungsbedarf sein, es erfüllt aber meinen Zweck, die einzelnen chars kontrolliert nach Zeile / Spalte ausgeben zu lassen.

Gruß
 
Zurück
Oben