Resumen Cantidad de lineas de un fichero

Mensaje enviado por Diego Buendía <diegobb@teleline.es>

Raul:

No tienes muchas alternativas, la que usas es quizá la más simple. Otra
posibilidad que puede ser más rápida es usar Open ... For Binary ... y leer los datos en un array de bytes (Dim b() as Byte), y luego usar un bucle interno For Next que se repase el array buscando el carácter ASCII 13.

Hace unas semanas tuvimos una conversación aquí sobre esto y comprobamos que eso es lo más que se puede conseguir en VB (y que en C puedes hacerlo muchísimo más rápido). Te añado el código que ganó el concurso de acceso rápido a ficheros, cortesía de Santiago Ezcurra:

=====================================================

Explico brevemente
La idea es levanta un bloque de 100 K en un array de tipo byte, analizar en el array (que es mucho mas rapido que en disco), opcionalmente marcar posiciones dentro del array (para eso esta la funcion marcarposicion) y pasar al proximo bloque.

El tamaño del bloque es parametrizable, por lo que se puede modificar segun los recursos de memoria con que se cuenten, pero siempre es conveniente que sea lo mas grande posible.

Siempre el movimiento es mas rapido sobre memoria que sobre disco. Si no hubiera problemas de memoria lo mejor seria setear el tamaño de bloque a 1 Mb y listo.

Para probarlo hay que guardar un nombre de archivo valido en strArchivo y llamar a la funcion leer, pasandole como parametro un caracter a buscar. De la misma forma, con pocas lineas de codigo, se puede hacer algo para evaluar cadenas, en lugar de caracteres individuales.


'Declaraciones
'
Const LARGOBUFFER as long = 102400 ' Largo de 100 K
Dim BookMarks As Variant
Dim strArchivo As String



Public Sub Leer(strCaracter)

Dim PosicionRelativa As Long
Dim lngX As Long
Dim intAsc as integer
Dim ByteRel As Byte
Dim buffer(1 To LARGOBUFFER) As Byte
intAsc = asc(strcaracter)
Open strArchivo For Binary As #1
PosicionRelativa = 0
While Not EOF(1)
    Get #1, , buffer
    For lngX = 1 To UBound(buffer)
        Select Case buffer(lngX)
            Case intAsc
                MarcarPosicion (PosicionRelativa + lngX)
        End Select
    Next lngX
    PosicionRelativa = PosicionRelativa + LARGOBUFFER
Wend
Close #1
End Sub


Private Sub MarcarPosicion(lngPos As Long)
    If not IsArray(BookMarks) Then
        ReDim BookMarks(1)
    Else
        ReDim Preserve BookMarks(UBound(BookMarks) + 1)
    End If
    BookMarks(UBound(BookMarks)) = lngPos
End Sub

==================================================

Aunque no es exactamente tu problema, espero que te ayude.

Un saludo desde España,

Diego Buendía
Barcelona, Spain
diegobb@teleline.es


----- Original Message -----
From: Raul Ruiz Dominguez <raul@cfg.cfg.onat.gov.cu>
To: <vb-esp@ccc.uba.ar>
Sent: Thursday, October 28, 1999 2:45 PM
Subject: vb-esp : Cantidad de lineas de un fichero


Hola colegas, necesito contar la cantidad de lineas que contiene un fichero de texto para luego poder mostrar una barra de progreso mientras ejecuto cierto proceso sobre el.



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com