Saltar al contenido

Obtenga las últimas 10 líneas de un archivo de texto muy grande > 10 GB

Esta es el arreglo más exacta que encomtrarás dar, sin embargo obsérvala detenidamente y valora si se adapta a tu proyecto.

Solución:

Lea hasta el final del archivo, luego busque hacia atrás hasta que encuentre diez líneas nuevas y luego lea hacia adelante hasta el final teniendo en cuenta varias codificaciones. Asegúrese de manejar los casos en los que el número de líneas del archivo sea inferior a diez. A continuación se muestra una implementación (en C# como etiquetó esto), generalizada para encontrar el último numberOfTokens en el archivo ubicado en path codificado en encoding donde el separador de fichas está representado por tokenSeparator; el resultado se devuelve como un string (esto podría mejorarse devolviendo un IEnumerable que enumera las fichas).

public static string ReadEndTokens(string path, Int64 numberOfTokens, Encoding encoding, string tokenSeparator) 

    int sizeOfChar = encoding.GetByteCount("n");
    byte[] buffer = encoding.GetBytes(tokenSeparator);


    using (FileStream fs = new FileStream(path, FileMode.Open)) 
        Int64 tokenCount = 0;
        Int64 endPosition = fs.Length / sizeOfChar;

        for (Int64 position = sizeOfChar; position < endPosition; position += sizeOfChar) 
            fs.Seek(-position, SeekOrigin.End);
            fs.Read(buffer, 0, buffer.Length);

            if (encoding.GetString(buffer) == tokenSeparator) 
                tokenCount++;
                if (tokenCount == numberOfTokens) 
                    byte[] returnBuffer = new byte[fs.Length - fs.Position];
                    fs.Read(returnBuffer, 0, returnBuffer.Length);
                    return encoding.GetString(returnBuffer);
                
            
        

        // handle case where number of tokens in file is less than numberOfTokens
        fs.Seek(0, SeekOrigin.Begin);
        buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        return encoding.GetString(buffer);
    

Probablemente lo abriría como un flujo binario, buscaría hasta el final y luego retrocedería buscando saltos de línea. Haga una copia de seguridad de 10 (u 11 dependiendo de la última línea) para encontrar sus 10 líneas, luego simplemente lea hasta el final y use Encoding.GetString en lo que lea para convertirlo en un string formato. Dividir como se desee.

¿Cola? Tail es un comando de Unix que mostrará las últimas líneas de un archivo. Existe una versión de Windows en el kit de recursos de Windows 2003 Server.

Comentarios y valoraciones

Te invitamos a auxiliar nuestra función poniendo un comentario o puntuándolo te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *