Question

C’est ainsi que je lis le fichier:

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

Le problème est si long (le fichier .txt fait environ 2,5 Mo). A pris plus de 5 minutes. Y a-t-il un meilleur moyen?

Solution prise

    public static string readFile(string path)
    {

       return File.ReadAllText(path);

    }

A pris moins de 1 seconde ...:)

Était-ce utile?

La solution

Laissant de côté les noms de variables horribles et l'absence d'une instruction using (vous ne fermerez pas le fichier s'il y a des exceptions), cela devrait aller, et certainement ne devrait pas prendre moins de 5 minutes lire 2,5 Mo.

Où réside le fichier? Est-ce sur un partage réseau flaky?

En passant, la seule différence entre ce que vous faites et l’utilisation de File.ReadAllText est que vous perdez des sauts de ligne. Est-ce délibéré? Combien de temps dure ReadAllText?

Autres conseils

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

À noter ici, S n'est jamais défini après ce ReadLine () initial, de sorte que la condition S! = null ne se déclenche jamais si vous entrer dans la boucle while. Essayez:

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

ou utilisez l'un des autres commentaires.

Si vous devez supprimer les nouvelles lignes, utilisez string.Replace (Environment.NewLine, ""))

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

Marcus Griep a raison. C’est si long parce que vous avez une boucle infinie. copiez votre code et apportait ses modifications et lisait un fichier texte de 2,4 M en moins d’une seconde.

mais je pense que vous risquez de manquer la première ligne du fichier. Essayez ceci.


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

Avez-vous besoin de la totalité des 2,5 Mo de mémoire en même temps?

Sinon, j'essaierais de travailler avec ce dont vous avez besoin.

Utilisez plutôt System.IO.File.RealAllLines.

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

Vous pouvez également estimer le nombre de caractères et le transmettre au constructeur de StringBuilder, car sa capacité devrait l'accélérer.

Essayez ceci, cela devrait être beaucoup plus rapide:

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

Au fait: la prochaine fois que vous vous retrouverez dans une situation similaire, essayez de préallouer de la mémoire. Cela améliore considérablement l’exécution, quelles que soient les structures de données exactes que vous utilisez. La plupart des conteneurs ( StringBuilder également) ont un constructeur qui vous permet de réserver de la mémoire. De cette manière, des réaffectations moins longues sont nécessaires pendant le processus de lecture.

Par exemple, vous pouvez écrire ce qui suit si vous souhaitez lire les données d'un fichier dans un StringBuilder :

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

(Cast nécessaire car System.IO.FileInfo.Length est long .)

ReadAllText était une très bonne solution pour moi. J'ai utilisé le code suivant pour un fichier texte de 3 000 000 lignes et il a fallu 4 à 5 secondes pour lire toutes les lignes.

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

La boucle et StringBuilder peuvent être redondants; Essayez d'utiliser ReadToEnd .

Pour lire un fichier texte plus rapidement, vous pouvez utiliser quelque chose comme ceci

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

J'espère que cela vous aidera. et pour plus d'informations, s'il vous plaît visitez le lien suivant- moyen le plus rapide de lire des fichiers texte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top