Visual Basic - ¿Cómo puedo abrir este fichero de texto?

Life is soft - evento anual de software empresarial
 
Vista:

¿Cómo puedo abrir este fichero de texto?

Publicado por Jesús (12 intervenciones) el 10/09/2002 10:23:23
Hola y gracias por leer esto, mi problema es el siguiente,

tengo un fichero de texto lineal, formado por una cadena de 9 dígito y separado por un blanco(ej. "123456789 543212345 1234...."),así hasta 200.000 cadenas. Mi problema esta en que este fichero es lineal, es decir, los 200.000 números estan en una línea, y yo necesito que en vez de estar uno tras de otro(horizontal), esten uno debajo de otro(vertical).
No me importa guardo en otro fichero de texto o en una base de datos, pero necesito tener 200.000 líneas o 200.000 registros.

Muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿Cómo puedo abrir este fichero de texto?

Publicado por TheMente (39 intervenciones) el 10/09/2002 13:23:59
Busca ayuda sobre el comando Split(), es la solucion a tu problema
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Muy sencillo

Publicado por Richi317 (95 intervenciones) el 10/09/2002 14:58:02
Hola Jesús:
Lo que quieres hacer es muy sencillo:
1. abre el fichero
2. lee la línea enorme.
3. usa la función "split"
4. guarda cada dato en un nuevo fichero.

Ahí va un trozo de código que te resultará muy útil:

Dim f As Integer
f = FreeFile
Open sFichero For Input Access Read As #f
Dim sLinea As String
Line Input #f, sLinea 'LEES LA LINEA
close #f

Dim vPartes As Variant
vPartes = Split(sLinea, CAR_SEP)

'CAR_SEP es el carácter de separación entre "campos". En tu caso es un espacio en blanco.

'Ahora, vPartes(0) contendrá el primer campo
'vPartes(1) contendrá el segundo
'vPartes(199999) el campo o registro número 200000.

'Usa un bucle para guardar cada registro o campo en otro fichero:
f = FreeFile 'fichero temporal de conversión
Open App.Path & NUEVO_FICHERO For Output Access Write As #f
For i = 0 To UBound(vPartes)
Print #f, vPartes(i)
Next i
Close #f

------
Y ya está. El único problema que te podrías encontrar es el tamaño de la línea. Quizá sea demasiado grande y debas utilizar enteros Long.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Muchas Gracias a los 2

Publicado por Jesús (12 intervenciones) el 10/09/2002 15:33:32
Sinceramente muchas gracias,

entre la ayuda de los dos he conseguido mi proposito. Lo unico que me queda ahora es depurar el programa, para podermerte el caracter separador distinto de blanco, que me indique el numero de registros que lleva, y que el ordenador no se me quede como "colgado" mientras se ejecuta el programa.Si teneis alguna idea estoy abierto a cualquier sugerencia.De nuevo os doy la gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Muchas Gracias a los 2

Publicado por TheMente (39 intervenciones) el 10/09/2002 18:49:13
La cantidad total de registros la tienes en el Ubound(Vpartes), solo deberias hacer que dentro del bucle de grabacion del nuevo fichero, se haga la actualizacion de un label con el indice de la matriz que estas recorriendo.
Para liberar otros procesos deberias utilizar DoEvents en los bucles de lectura y escritura del los archivos de texto.
Si quieres hacer que el caracter separador sea configurable, deberias cargar una variable CAR_SEP desde algun otro archivo de teto o ini y asiganar esa variable a Split(cadena, CAR_SEP), no lo he probado a esto para ver si Split te acepta variables como argumento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Progreso de lectura

Publicado por Richi317 (95 intervenciones) el 11/09/2002 15:26:25
Lo que dice TheMente es correcto. Lo explicado está siendo usado en una aplicación comercial con muy buen resultado. Para que el usuario "vea" el progreso de lectura/escritura/tratamiento/conversión de los datos (muchos registros) utilizo un Timer puesto a 1000 ms. Dentro del Timer actualizo la Label con la información de registros leídos o escritos (nº leidos de un total de XXX). Si actualizo cada número, es más lento. Para un número de registros como el que vas a tratas (200 mil), que son muchos, usa mejor un Timer. Es muy sencillo y no tiene gasto de recursos.

También puedes usar un Progress Bar. Es muy fácil de hacer, pero consume algo más de recursos y memoria. La forma de hacerlo sería igual, usando un Timer pero actualizando el Progress Bar en su interior mediante un cálculo del porcentaje que falta para llegar al final.

No te olvides del DoEvents. Si no lo pones, no verás nada hasta el final de la operación. Y si usas el Progress Bar, ASEGURATE que la propiedad VALUE nunca sobrepase el máximo valor permitido o dará un error de desbordamiento.
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar