Pergunta

Esta é a maneira que eu ler o arquivo:

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

O problema é tão longa (o arquivo .txt é de cerca de 2,5 megas). Levou ao longo de 5 minutos. Existe uma maneira melhor?

Solução tomado

    public static string readFile(string path)
    {

       return File.ReadAllText(path);

    }

Levou menos de 1 segundo ...:)

Foi útil?

Solução

Deixando de lado os nomes de variáveis ??horríveis e a falta de uma instrução using (você não fechar o arquivo se existem exceções) que deve estar bem, e certamente não deve demorar 5 minutos para ler 2,5 megas.

Onde é que o arquivo vivo? É em um compartilhamento de rede esquisito?

A propósito, a única diferença entre o que você está fazendo e usando File.ReadAllText é que você está quebras de linha perdedora. É este deliberada? Quanto tempo faz ReadAllText take?

Outras dicas

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

De nota aqui, S nunca é definido depois que ReadLine() inicial, de modo que a condição S != null nunca ativa se você digitar o loop while. Tente:

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

ou o uso de um dos outros comentários.

Se você precisa remover novas linhas, o uso String.Replace (Environment.NewLine, "")

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

Marcus Griep tem direito. TI está demorando tanto porque você tem um loop infinito. copiado o código e fez suas mudanças e ler um arquivo de texto 2,4 M em menos de um segundo.

mas eu acho que você pode perder a primeira linha do arquivo. Tente isto.


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

Você precisa de toda a 2,5 Mb na memória de uma vez?

Se não, eu iria tentar trabalhar com o que você precisa.

Use System.IO.File.RealAllLines vez.

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

Como alternativa, estimando a contagem de caracteres e passar isso para o construtor de StringBuilder como a capacidade deve acelerá-lo.

Tente isso, deve ser muito mais rápido:

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

A propósito: Da próxima vez que você está em uma situação semelhante, tente memória pré-alocação. Isso melhora runtime drasticamente, independentemente das estruturas de dados exatas que você usa. A maioria dos recipientes (StringBuilder também) ter um construtor que lhe permitem memória de reserva. Desta forma, menos realocações demoradas são necessárias durante o processo de leitura.

Por exemplo, você poderia escrever o seguinte, se você quiser ler dados de um arquivo em um StringBuilder:

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

(CAST necessário porque System.IO.FileInfo.Length é long.)

ReadAllText foi uma solução muito boa para mim. Eu costumava seguinte código para o arquivo de texto 3.000.000 fila e levou 4-5 segundos para ler todas as linhas.

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

O loop e StringBuilder pode ser redundante; tente usar ReadToEnd .

Para ler um arquivo de texto mais rápido você pode usar algo como isto

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

Espero que isso irá ajudá-lo. e para mais informações, visite o seguinte link- maneira de ler arquivos mais rápidos texto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top