Resumen Leer archivos de texto   (2 mensajes )

Definitivamente lo que pides NO es posible: NO se puede obtener información de TODO el archivo SIN leerlo por completo.
Lo que si puedes hacer es evitarte leerlo línea por línea, lo que hará que el proceso de saber cuantas líneas tiene sea mucho más veloz.
Te paso un código que espero te ayude.
Lo que hace es utilizar el acceso binario para leer el archivo de a bloques de 64 Kb.
El código de la función ContarLíneas no ha sido testeado, por lo que tal vez merece algun que otro "retoque".
Espero que te sirva.

Salu2


'Declara Constantes Globales
Const BlockSizeConst As Single = 65535

Private Function ContarLineas (M As Variant) As Long
'recibe una matriz de 64 Kb y retorna la cantidad de caracteres chr(10) que encontró '(la cantidad de líneas).
Dim NumLineas as Long
Dim Cadena as String
Dim Pos as Long
    Cadena = CStr(M)
    NumLineas = 0
    Pos = InStr(1,Cadena,chr(10))
    While Pos <> 0
        NumLineas = NumLineas + 1
        Pos = InsStr(1,Cadena,chr(10))
    Wend
    ContarLineas = NumLineas
End Function

Private Function ContarLineasDeArchivo(NombreArchivo as String) as Long
'utiliza el acceso binario para leer el archivo de a bloques de 64 Kb, contando
'las líneas que hay en cada bloque

'Declara Variables
Dim Arch As Integer
Dim LofArch As Long
Dim CantLineas As Long; 'número de líneas totales
Dim ByteMatriz() As Byte
Dim BlockSize As Single

'Inicializa Archivo
Arch = FreeFile()
Open NombreArchivo For Binary As Arch
LofArch = LOF(Arch)

'Establece Tamaño de Bloque adaptándolo al archivo
If LofArch < BlockSizeConst Then
    BlockSize = LofArch
    Else
      BlockSize = BlockSizeConst
End If
ReDim ByteMatriz(BlockSize)

'Lee Bloque/s desde Disco contando líneas
PosArch = 1
CantLineas = 0
While PosArch + BlockSize <= LofArch 'significa que se puede seguir leyendo
    Get Arch, PosArch, ByteMatriz
    PosArch = PosArch + BlockSize
    CantLineas = CantLineas + ContarLineas(ByteMatriz)
    DoEvents
Wend

'Procesa la cola del archivo
If LofArch > PosArch then
    ReDim ByteMatriz(LofArch - PosArch)
       Get Arch, PosArch, ByteMatriz
       Call ContarLineas(ByteMatriz, NumLineas)
    CantLineas = CantLineas + ContarLineas(ByteMatriz)
End if

'Cierra Archivo
Close (Arch)

ContarLineasdeArchivo = CantLineas

End Function



>Tengo un archivo plano de N lineas, cada linea tiene un tamaño
>diferente! para leer el arcihvo utilizo line input y funciona bien! pero
>lo que necesito es saber cuantas lineas tiene el archivo sin tener que
>recorrerlo hasta el final! y lo otro es posible obtener informacion de
>la ultima linea?

Ok, vamos por partes. Lo tuyo entra dentro de lo que yo llamaria
optimizacion de un programa.
Para contar la cantidad de lineas deberias contar la cantidad de CR+LF que tenes en el archivo, y esto no es posible hacerlo sin leerlo.
Los archivos de texto de entrada tienen tamaños razonables, lo que yo hago en estos casos es cargalos a un string y a partir de alli hago todo el procesamiento. Lo que logro con esto es velocidad ya que accedo a leer el archivo 1 sola vez. Si te resulta atractivo hacerlo asi luego usando la funcion "IsStr" podrias contar la cantidad de CR+LF que tenes en el archivo y buscar la ultima linea no es muy complicado tampoco.
En particular yo he cargado archvos de texto a memoria de 4Mb.
Aca tenes una funcion para cargar una archivo a memoria

Sub ReadFileToMem(PathName)
'Lee el archivo de texto completo y lo coloca
'en la variable Global FileImage
'Creo que es mas rapido cargar el archivo en memoria
'que accederlo de disco.
Dim h As Integer
  h = FreeFile
  FileSize = FileLen(PathName)
  Open PathName For Binary Access Read As #h
  FileImage = Input(FileSize, #h)
  Close #h
End Sub


>Tengo un archivo plano de N lineas, cada linea tiene un tamaño
>diferente! para leer el arcihvo utilizo line input y funciona bien! pero
>lo que necesito es saber cuantas lineas tiene el archivo sin tener que
>recorrerlo hasta el final! y lo otro es posible obtener informacion de
>la ultima linea?



Resumen Resumen

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com