Domanda

Questo è il modo in cui ho letto il file:

    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();
    }

Il problema è che è così lungo (il file .txt è di circa 2,5 mega). Ci sono voluti più di 5 minuti. C'è un modo migliore?

Soluzione adottata

    public static string readFile(string path)
    {

       return File.ReadAllText(path);

    }

Ha impiegato meno di 1 secondo ... :)

È stato utile?

Soluzione

Lasciando da parte i nomi delle variabili orribili e la mancanza di un'istruzione using (non chiuderai il file se ci sono eccezioni) che dovrebbe andare bene, e certamente non dovrebbe richiedere 5 minuti per leggere 2,5 mega.

Dove risiede il file? È su una condivisione di rete traballante?

A proposito, l'unica differenza tra ciò che stai facendo e l'utilizzo di File.ReadAllText è che stai perdendo le interruzioni di riga. È deliberato? Quanto tempo richiede ReadAllText?

Altri suggerimenti

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

Da notare qui, S non viene mai impostato dopo quel ReadLine () iniziale, quindi la condizione S! = null non si attiva mai se entra nel ciclo while. Prova:

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

o usa uno degli altri commenti.

Se devi rimuovere newline, usa string.Replace (Environment.NewLine, " ")

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

Marcus Griep ha ragione. Sta impiegando così tanto tempo perché AVETE UN LOOP INFINITO. ha copiato il codice e apportato le sue modifiche e ha letto un file di testo di 2,4 M in meno di un secondo.

ma penso che potresti perdere la prima riga del file. Prova questo.


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

Hai bisogno dell'intera memoria da 2,5 Mb contemporaneamente?

In caso contrario, proverei a lavorare con ciò di cui hai bisogno.

Utilizzare invece System.IO.File.RealAllLines.

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

In alternativa, stimare il conteggio dei caratteri e passarlo al costruttore di StringBuilder poiché la capacità dovrebbe accelerarlo.

Prova questo, dovrebbe essere molto più veloce:

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

A proposito: la prossima volta che ti trovi in ??una situazione simile, prova a pre-allocare memoria. Ciò migliora drasticamente il runtime, indipendentemente dalle esatte strutture di dati utilizzate. La maggior parte dei container ( StringBuilder ) ha anche un costruttore che consente di riservare memoria. In questo modo, durante il processo di lettura sono necessari riallocazioni meno dispendiose in termini di tempo.

Ad esempio, potresti scrivere quanto segue se vuoi leggere i dati da un file in un StringBuilder :

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

(Cast necessario perché System.IO.FileInfo.Length è long .)

ReadAllText è stata un'ottima soluzione per me. Ho usato il seguente codice per un file di testo di 3.000.000 di righe e ci sono voluti 4-5 secondi per leggere tutte le righe.

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

Il ciclo e StringBuilder possono essere ridondanti; Prova a usare ReadToEnd .

Per leggere un file di testo più velocemente puoi usare qualcosa del genere

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 "";
        }
    }

Spero che questo ti possa aiutare. e per maggiori informazioni, visitare il seguente link- Il modo più veloce per leggere i file di testo

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top