Frage

Dies ist die Art, wie ich Datei lesen:

    public static string readFile(string path)
    {
        StringBuilder stringFromFile = new StringBuilder();
        StreamReader SR;
        string S;
        SR = File.OpenText(path);
        S = SR.ReadLine();
        while (S != null)
        {
            stringFromFile.Append(SR.ReadLine());
        }
        SR.Close();
        return stringFromFile.ToString();
    }

Das Problem ist, es so lange (die TXT-Datei ist etwa 2,5 MB). Nahm mehr als 5 Minuten. Gibt es einen besseren Weg?

Lösung genommen

    public static string readFile(string path)
    {

       return File.ReadAllText(path);

    }

Nahm weniger als 1 Sekunde ...:)

War es hilfreich?

Lösung

die schrecklichen Variablennamen Abgesehen und das Fehlen einer using-Anweisung (Sie werden nicht schließen Sie die Datei, wenn es Ausnahmen gibt), die in Ordnung sein sollte, und sicher sollten Nehmen Sie nicht 5 Minuten 2.5 MB zu lesen.

Wo wohnt die Datei? Ist es auf einem flockigen Netzwerkfreigabe?

Übrigens, der einzige Unterschied zwischen dem, was Sie tun und File.ReadAllText ist, dass Sie Zeilenumbrüche sind zu verlieren. Ist das Absicht? Wie lange dauert ReadAllText nehmen?

Andere Tipps

S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(SR.ReadLine());
}

Bemerkenswert hier ist S nie nach diesem anfänglichen ReadLine() eingestellt, so dass der S != null Zustand löst nie, wenn Sie die while-Schleife ein. Versuchen Sie:

S = SR.ReadLine();
while (S != null)
{
    stringFromFile.Append(S = SR.ReadLine());
}

oder eine der anderen Kommentare verwenden.

Wenn Sie Zeilenumbrüche zu entfernen, verwenden Sie String.Replace (Environment.NewLine, "")

return System.IO.File.ReadAllText(path);

Marcus Griep hat es richtig. Es dauert so lange, weil Sie eine ENDLOSSCHLEIFE HABEN. Ihren Code kopiert und machte seine Änderungen und las ein zweiten eine 2,4 M Textdatei in weniger als.

, aber ich glaube, Sie könnten die erste Zeile der Datei verpassen. Versuchen Sie dies.


S = SR.ReadLine();
while (S != null){
    stringFromFile.Append(S);
    S = SR.ReadLine();
}

Haben Sie auf einmal die gesamte 2,5 Mb im Speicher benötigen?

Wenn nicht, würde ich versuchen, mit zu arbeiten, was Sie brauchen.

Verwenden System.IO.File.RealAllLines statt.

http://msdn.microsoft.com /en-us/library/system.io.file.readalllines.aspx

Alternativ können Sie die Zeichenzahl Schätze und beiläufig, dass Konstruktor String ist als die Kapazität es beschleunigen sollte auf.

Versuchen Sie, dies sollte viel schneller sein:

var str = System.IO.File.ReadAllText(path);
return str.Replace(Environment.NewLine, "");

Übrigens: Das nächste Mal, wenn Sie in einer ähnlichen Situation sind, versuchen Sie im Voraus zugeordnet Speicher. Dies verbessert die Laufzeit drastisch, unabhängig von den genauen Datenstrukturen Sie verwenden. Die meisten Container (StringBuilder auch) haben einen Konstruktor, der Sie Speicher reservieren lassen. Auf diese Weise weniger zeitaufwendig Umschichtungen erforderlich während des Lesevorgangs.

Zum Beispiel könnten Sie die folgende schreiben, wenn Sie Daten aus einer Datei in eine StringBuilder zu lesen:

var info = new FileInfo(path);
var sb = new StringBuilder((int)info.Length);

(Cast notwendig, weil System.IO.FileInfo.Length long ist.)

ReadAllText war eine sehr gute Lösung für mich. Früher habe ich für 3.000.000 Zeilen Textdatei folgenden Code, und es dauerte 4-5 Sekunden, um alle Zeilen zu lesen.

string fileContent = System.IO.File.ReadAllText(txtFilePath.Text)
string[] arr = fileContent.Split('\n');

die Schleife und StringBuilder können redundant; versuchen Sie es mit ReadToEnd .

eine Textdatei lesen schnellste Sie so etwas wie dieses verwenden

public static string ReadFileAndFetchStringInSingleLine(string file)
    {
        StringBuilder sb;
        try
        {
            sb = new StringBuilder();
            using (FileStream fs = File.Open(file, FileMode.Open))
            {
                using (BufferedStream bs = new BufferedStream(fs))
                {
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        string str;
                        while ((str = sr.ReadLine()) != null)
                        {
                            sb.Append(str);
                        }
                    }
                }
            }
            return sb.ToString();
        }
        catch (Exception ex)
        {
            return "";
        }
    }

Hope dies wird Ihnen helfen. und für weitere Informationen, besuchen Sie bitte die folgenden Link- schnellste Weg, Textdateien Lesen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top