2011-09-26 9 views
14

¿Hay alguna manera de obtener el número de líneas dentro de un archivo de texto grande, pero sin leer el contenido del archivo o leer el archivo para finalizar y contar ++.Cómo obtener el número de líneas sin leer el archivo para finalizar

Quizás haya algunos Atributos de archivo, pero no se puede encontrar en absoluto. Como en algunos casos debería obtener el Número total de líneas y compararlo con la línea actual para mostrar el Porcentaje, y solo por una Visualización porcentual, podría ser estúpido leer primero todo el Contenido que leerlo nuevamente Para mostrar la información en bruto texto al usuario

mejores

+0

Si controla el formato de archivo, puede insertar el número de líneas como metadatos en un archivo externo o en el encabezado del archivo. También podría leer, carácter por carácter y comprobar si hay caracteres de nueva línea. Sin embargo, eso no sería terriblemente rápido. – Travis

+0

Como todos ya lo han indicado, una opción viable sería agregar su propio encabezado al archivo. Hice esto para una implementación de modelo de Wavefront personalizada para mi juego. Básicamente, tengo una herramienta que optimiza los archivos .obj, eliminando la basura que no necesito, y luego escribe el número total de líneas, caras, normales, vértices y texturas UV en la primera línea.Luego, los datos son utilizados por varios buffers cuando se carga el modelo. – Krythic

Respuesta

19

No. Tiene que leer el archivo. Considere almacenarlo al principio del archivo o en un archivo separado cuando escriba el archivo si desea encontrarlo rápidamente sin contar.

Tenga en cuenta que usted puede transmitir el archivo, y es sorprendentemente rápido:

int count = File.ReadLines(path).Count(); 

porque podría ser en algunos casos en los que debería obtener Número Total de la Línea de y compararlo con la línea actual para mostrar la Porcentaje, y solo para una pantalla de porcentaje, puede ser estúpido leer primero todo el contenido que leerlo nuevamente para mostrar el texto sin procesar al usuario.

Ah, solo obtenga el tamaño del archivo y la longitud de cada línea en bytes y mantenga un recuento acumulado del número de bytes procesados ​​hasta el momento.

+2

Creo que causará problemas de memoria, porque manejo con archivos < > Archivo de registro 8Gb generado desde otra aplicación – Burimi

+1

@Cody: El método 'File.ReadLines' no lee todo el archivo a la vez, por lo que no usará mucho memoria. Sin embargo, solo está disponible en Framework 4 o posterior. – Guffa

+1

@Cody: es posible que desee probar eso. 'File.ReadLines' devuelve un' IEnumerable '- no lee todo el archivo en la memoria a la vez. –

13

No, no hay otra manera.

Un archivo no está basado en línea (o incluso en caracteres), por lo que no hay metainformación sobre el número de líneas (o incluso el número de caracteres). Los únicos metadatos sobre el contenido son la longitud en bytes.

Si tiene alguna información adicional sobre el archivo, por ejemplo, que cada línea tiene exactamente la misma longitud, y usa una codificación de 8 bits para que el número de caracteres sea el mismo que el número de bytes, podría calcule el número de líneas del tamaño del archivo.

+0

+1 ... y tiene una secuencia de finalización de línea definida, por ejemplo, '\ r \ n' vs.' \ n' – RedFilter

+0

@Guffa podría decirle a FileZilla que: P - no solo bromeando, estoy manejando con FileZilla Log File y son terriblemente grandes, así que creo que no mostraré el Porcentaje. – Burimi

+0

@Cody: puede utilizar una longitud de línea promedio estimada para obtener un porcentaje aproximado, o calcular el porcentaje según la posición del archivo en lugar de la línea. – Guffa

5

Como Guffa y Jason dijeron, no hay forma de obtener las líneas que no sean leer hasta el final.

para resolver su problema de manera diferente:

Si usted está interesado sólo en la pantalla de porcentaje podría intentar acummulate que el valor del tamaño total del archivo y la línea que está actualmente. Debe aplicar algunos trucos vudú para obtener los bytes reales leídos (como decir, ha leído en la línea 10, y un total de 200 bytes o lo que sea) y el tamaño del archivo es de 400 bytes. Probablemente puedas adivinar que estás al 50%, sin necesidad de saber un número de línea total.

Eso es sólo algunos números al azar allí, por cierto.

+0

+1 para una explicación y una posible ingestión – Burimi

+0

Si solo necesita el porcentaje y no el número de línea total, creo que es totalmente factible – UrbanEsc

Cuestiones relacionadas