Pregunta

Esta es la forma en que leo el archivo:

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

El problema es que es tan largo (el archivo .txt tiene aproximadamente 2,5 megas). Tomó más de 5 minutos. ¿Hay una mejor manera?

Solución tomada

    public static string readFile(string path)
    {

       return File.ReadAllText(path);

    }

Tomó menos de 1 segundo ... :)

¿Fue útil?

Solución

Dejando a un lado los horribles nombres de las variables y la falta de una declaración de uso (no cerrará el archivo si hay alguna excepción) que debería estar bien, y ciertamente no debería tomar 5 minutos para leer 2,5 megas.

¿Dónde está el archivo en vivo? ¿Está en una red compartida escamosa?

Por cierto, la única diferencia entre lo que estás haciendo y usando File.ReadAllText es que estás perdiendo saltos de línea. ¿Es esto deliberado? ¿Cuánto tiempo tarda ReadAllText?

Otros consejos

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

Cabe destacar que S nunca se establece después de esa ReadLine () inicial, por lo que la condición S! = null nunca se activa si entrar en el bucle while. Prueba:

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

o usa uno de los otros comentarios.

Si necesita eliminar nuevas líneas, use string.Replace (Environment.NewLine, " ")

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

Marcus Griep tiene razón. Está tardando mucho porque TIENES UN BUCLE INFINITO. copió su código e hizo sus cambios y leyó un archivo de texto de 2.4 M en menos de un segundo.

pero creo que puede perderse la primera línea del archivo. Prueba esto.


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

¿Necesita toda la memoria de 2.5 Mb a la vez?

Si no, trataría de trabajar con lo que necesita.

Utilice System.IO.File.RealAllLines en su lugar.

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

Alternativamente, estimar el recuento de caracteres y pasarlo al constructor de StringBuilder, ya que la capacidad debería acelerarlo.

Prueba esto, debería ser mucho más rápido:

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

Por cierto: la próxima vez que se encuentre en una situación similar, intente preasignar memoria. Esto mejora drásticamente el tiempo de ejecución, independientemente de las estructuras de datos exactas que utilice. La mayoría de los contenedores ( StringBuilder también) tienen un constructor que le permite reservar memoria. De esta manera, se necesitan reasignaciones que consuman menos tiempo durante el proceso de lectura.

Por ejemplo, podría escribir lo siguiente si desea leer datos de un archivo en un StringBuilder :

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

(Transmitir necesario porque System.IO.FileInfo.Length es largo .)

ReadAllText fue una muy buena solución para mí. Utilicé el siguiente código para el archivo de texto de 3.000.000 filas y tardó de 4 a 5 segundos en leer todas las filas.

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

El bucle y StringBuilder pueden ser redundantes; Intenta usar ReadToEnd .

Para leer un archivo de texto más rápido, puede usar algo como esto

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 esto te ayude. y para más información, por favor visite el siguiente enlace- La forma más rápida de leer archivos de texto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top