5 Stimmen

.net: Gibt es eine Möglichkeit, eine txt-Datei von unten nach oben zu lesen?

Mögliches Duplikat:
Wie man eine Textdatei umgekehrt mit Iterator in C# liest

Ich frage mich, wenn es eine Möglichkeit, eine Textdatei von unten nach oben ohne Leistungseinbußen zu lesen, die readLine, movenext Ansatz, aber umgekehrt, ist diese Art von Sache möglich in .net?

Um die Sache noch interessanter zu machen, hat die Textdatei etwa 100 000 Zeilen, so dass ich nicht mit einem readall, reverse... mogeln kann.

Einige weitere Details: Ich habe eine Sammlung von eingehenden String-Werten, denen eine int-ID vorangestellt ist, die sortiert werden kann. Leider erhalte ich diese IDs in der falschen Reihenfolge. Das Hauptproblem ist die schiere Menge der String-Werte, und kein RDBMS in der Lösung. Ich brauche also eine Möglichkeit, die String-Werte zu speichern und dann die Reihenfolge der Speicherung während der Verarbeitung umzukehren. Textdatei kam mir in den Sinn, weil ich zu diesem Zeitpunkt keine bessere Lösung habe.

Vielen Dank im Voraus.

1voto

t0mm13b Punkte 33393

Warum nicht die ReadToEnd() Methode einer StreamReader-Klasse und arbeiten dann rückwärts... Zugegeben, es ist nicht schön, aber es funktioniert, ich habe ein Byte-Array verwendet, um eine MemoryStream Instanz und die Verwendung dieser für die StreamReader werden die Daten beispielsweise mit Hilfe von Zeiger-Hokuspokus rückwärts gelesen.

unsafe
{
    byte\[\] b = System.Text.ASCIIEncoding.ASCII.GetBytes("Hello World! Foo wuz ere and so wuz bar");
    using (MemoryStream mStream = new MemoryStream(b))
    {
        string readStr;
        using (StreamReader sr = new StreamReader(mStream))
        {
            readStr = sr.ReadToEnd();
        }
        Console.WriteLine(readStr);
        fixed (char\* beg = readStr)
        {
            char\* p = beg + readStr.Length;
            while (p-- != beg)
            {
                Console.Write(\*p);
            }
        }
    }
}

0voto

Vivin Paliath Punkte 90791

Nur eine allgemeine Antwort. Wenn es eine Art von peek() Methode können Sie wahrscheinlich Ihren Dateizeiger auf filesize (o filesize - 1 ?) und dekrementieren Sie dann den Zeiger, bis Sie 0 erreichen. Möglicherweise gibt es eine Klasse in .NET, die dies abstrahiert. Natürlich müssen Sie eine Art von Puffergröße definieren (im Grunde die Größe der "Chunks" der Datei, die Sie einlesen). In diesem Fall wird die filesize - 1 oben könnte zu filesize - bufferSize , und Sie würden Ihren Dateizeiger um bufferSize auch.

0voto

Preet Sangha Punkte 62622

Ich denke, Sie können dies tun können die PInvoke verwenden, um dies über die WINAPI. Sie müssen eine Memory-Mapped-Datei erstellen, aber nur das Ende der Datei zuordnen und dann nach oben gehen.

0voto

Cory Charlton Punkte 8721

Sie erhalten also die Werte in der falschen Reihenfolge, wollen sie aber in der richtigen Reihenfolge wiederherstellen. Vielleicht ein

Stack<T> 

Würde für Sie funktionieren.

http://msdn.microsoft.com/en-us/library/3278tedw.aspx

Stellt eine LIFO-Sammlung (last-in-first-out) variabler Größe von Instanzen desselben beliebigen Typs dar.

-1voto

Avindra Goolcharan Punkte 3567

Mit der ReadBlock-Methode der StreamReader-Klasse können Sie ab einer bestimmten Position lesen. Ich bin mir nicht sicher, was die Leistung angeht. Vielleicht möchten Sie den Block einfach in ein Array einlesen und es dann umkehren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X