Dienstag, 2. November 2010

C# Textdatei zufällige Zeile auslesen

In diesem Post möchte ich zeigen, wie man mit C# eine zufällige Zeile aus einer Textdatei liest.
(Diesen Post schreibe ich im Rahmen der Posts für häufige Suchbegriffe.)
Leider gibt es in C# keine direkte Möglichkeit, auf eine bestimmte Zeile einer Textdatei zuzugreifen.
Denn die Inhalte von Dateien werden als Folgen von Bits gespeichert, verschiedene Zeilen sind erst in einer höheren Abstraktionsebene sichtbar.
Um nun eine zufällige Zeile aus einer Textdatei auszulesen, lesen wir zuerst alle Zeilen ein und geben dann eine zufällige Zeile aus.
Das Auslesen der Textdatei erfolgt über die Klasse StreamReader, die Methode ReadToEnd() liest den kompletten Inhalt der Textdatei aus und gibt diesen als String zurück.
Diesen String kann man mit der Methode Split() aufteilen, als Trennzeichen übergeben wir Environment.NewLine.
Diese Konstante gibt das auf dem aktuellen System verwendete Trennsymbol für Zeilenumbrüche zurück.
Unter Windows ist dieses Symbol "\r\n", da dieses quasi aus 2 verschiedenen Symbolen besteht wird der String zuoft gesplittet, jede 2. Zeile ist leer und wir setzen die Option StringSplitOptions.RemoveEmptyEntries
um diese leeren Zeilen zu löschen.

Zur Erzeugung von Zufallszahlen, was zur Rückgabe einer zufälligen Zeile benötigt wird, habe ich diesen Post geschrieben.

Und nun der Code für eine fertige Funktion, welche den Pfad zu der zu lesenden Textdatei als Parameter entgegen nimmt und als Ergebnis eine zufällige Zeile der Textdatei als String zurückgibt (oben im Projekt muss die Anweisung using System.IO; eingebunden sein):

private string ReadRandomTextLine(string path)
{
    StreamReader sr = new StreamReader(new FileStream(path, FileMode.Open)); // StreamReader zum Lesen der Datei im Pfad path
    string[] Lines = sr.ReadToEnd().Split(new string[] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries); // kompletten Inhalt der Datei auslesen und nach Zeilen splitten
    Random rnd = new Random(); // den Zufallsgenerator initialisieren
    return Lines[rnd.Next(Lines.Length)]; // eine zufällige Zeile zurückgeben
}

Keine Kommentare:

Kommentar veröffentlichen