Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Obtener datos de un archivo de texto

Estas en el tema de Obtener datos de un archivo de texto en el foro de Visual Basic clásico en Foros del Web. Quisiera saber si alguien dispone de codigo en visual basic 6.0 para poder acceder a un archivo de texto con numeros en filas y columnas ...
  #1 (permalink)  
Antiguo 04/11/2010, 07:20
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 13 años, 6 meses
Puntos: 0
Obtener datos de un archivo de texto

Quisiera saber si alguien dispone de codigo en visual basic 6.0 para poder acceder a un archivo de texto con numeros en filas y columnas (es un documento de excell salvado en formato de texto separado por tabuladores) que me lo proporciona un dispositivo al que no se puede cambiar este formato.

Se puede hacer manualmente pero necesito automatizar este proceso ya que hay que abrir muchos archivos de texto y lleva mucho tiempo.

Me gustaria poder acceder mediante el numero de fila y columna a los valores deseados del archivo, pero no se si sera posible. Tampoco importa que descargue todos los valores pero individualizados.



Muchas Gracias
  #2 (permalink)  
Antiguo 04/11/2010, 13:13
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Obtener datos de un archivo de texto

No lo he probado, pero creo que debería funcionar:

Código vb:
Ver original
  1. Function LeerRegistroTxt(ByVal NombreArchivo As String, ByVal Línea As Long, Optional ByVal Columna As Long) As String
  2.   Dim NumFichero As Integer
  3.   Dim Linea As String
  4.   On Error GoTo ErrorLectura
  5.   Open NombreArchivo For Input As #NumFichero
  6.   Do Until EOF(NumFichero)
  7.     If Linea = 0 Then Exit Do
  8.     Line Input #NumFichero, Linea
  9.     Linea = Linea - 1
  10.   Loop
  11.   If Columna > 0 Then
  12.     Dim Matriz() As String
  13.     Matriz = Split(Linea, vbTab)
  14.     Linea = Matriz(Columna - 1)
  15.   End If
  16.   LeerRegistroTxt = Linea
  17.   Exit Function
  18.  
  19. ErrorLectura:
  20.   MsgBox Err.Description
  21.   Err.Clear
  22.  
  23. End Function

Solo tienes que ir llamando a la función con los parámetros adecuados. Para eso lo más básico sería un form con 4 textbox, y un boton con el código:

Text4.Text = LeerRegistroTxt Text1, Text2, Text3

Donde text1 contendría el camino y nombre del fichero a leer y text2 y text3 la línea y columna. El valor buscado se mostrará como ya imaginarás en el text4.

Linea y Columna deben ser valores mayores que cero.

La columna la pongo como opcional y si no la incluyes debería devolver toda la línea

El camino al fichero de texto lo puedes evitar si copias el programa que has creado en la carpeta de los textos y ahí lo ejecutas. De ese modo solo tienes que poner los nombres de los textos en el text1.

Coméntame si falla el invento.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #3 (permalink)  
Antiguo 05/11/2010, 04:46
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Obtener datos de un archivo de texto

En primer lugar, muchas gracias PKJ por molestarte. De momento me da varios errores que quizas me ayudes a solucionar, pero parece que tiene buena pinta.

Empece cambiando el nombre de una de las variables que defines en la funcion "Línea", supongo que sera un error al intentar acentuar la palabra "linea" (por cierto, perdon porque yo no acentuo ninguna porque no se que problema tengo en el teclado que me sale algo as¨¨i).

Al definir esta variable con el nombre "linea" me da el error: "declaracion duplicada en el alcance actual" ya que en la linea 3 del programa se vuelve a definir la variable "linea" como string.

Si la cambio en la funcion por el nuevo nombre de fila1, me surge otro error:

"nombre o numero de archivo incorrecto"

Y por mas que modifico "#NumFichero" en la linea 5 del programa "Open NombreArchivo For Input As #NumFichero" me sigue dando el mismo error.

Muchas gracias y un saludo.
  #4 (permalink)  
Antiguo 05/11/2010, 04:55
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Obtener datos de un archivo de texto

Tienes toda la razón. He metido un acento y repetido el nombre a 2 variables. Que borrico
Aquí te lo dejo revisado. Comentame si funciona, ya que como no tengo ficheros de texto de ese tipo no puedo probarlo.

Código vb:
Ver original
  1. Function LeerRegistroTxt(ByVal NombreArchivo As String, ByVal numLinea As Long, Optional ByVal numColumna As Long) As String
  2.   Dim NumFichero As Integer
  3.   Dim Linea As String
  4.   On Error GoTo ErrorLectura
  5.   Open NombreArchivo For Input As #NumFichero
  6.   Do Until EOF(NumFichero)
  7.     If numLinea = 0 Then Exit Do
  8.     Line Input #NumFichero, Linea
  9.     numLinea = numLinea - 1
  10.   Loop
  11.   Close #NumFichero
  12.  
  13.   If numColumna > 0 Then
  14.     Dim Matriz() As String
  15.     Matriz = Split(Linea, vbTab)
  16.     Linea = Matriz(numColumna - 1)
  17.   End If
  18.   LeerRegistroTxt = Linea
  19.   Exit Function
  20.  
  21. ErrorLectura:
  22.   MsgBox Err.Description
  23.   Err.Clear
  24.  
  25. End Function

Saludos

PD: Tampoco cerraba el fichero despues de abrirlo. Estoy pasmao
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #5 (permalink)  
Antiguo 05/11/2010, 05:27
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Obtener datos de un archivo de texto

Sigue dando el error "Nombre o numero de archivo incorrecto". La ruta que le pongo en el textbox supongo que esta bien. La copio en el portapapeles desde las propiedades del archivo:

C:\Documents and Settings\Escritorio\libro1.txt

Supongo PKJ que la prueba se puede hacer con cualquier archivo de texto. Con el excell introducimos por ejemplo nueve numeros en tres filas y tres columnas salvamos como archivo de texto separado por tabuladores y ya tenemos el archivo para probar.
  #6 (permalink)  
Antiguo 05/11/2010, 05:30
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Obtener datos de un archivo de texto

Perdona, he visto otro fallo. No asigno valor a numfichero, y seguramente cuando vale 0 no es apto para usar como lo uso.
Añade esta línea antes del Open

NumFichero=Freefile

Puede que sea la solución.

Mientras tanto voy a ver si creo un texto de esos.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #7 (permalink)  
Antiguo 05/11/2010, 05:40
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Obtener datos de un archivo de texto

Ya lo he probado y con la línea que te he comentado se soluciona el problema.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #8 (permalink)  
Antiguo 05/11/2010, 05:48
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Obtener datos de un archivo de texto

Eureka. Ya funciona bien. No sabes como te lo agradezco PKJ. Aqui dejo el codigo que funciona. He añadido un bucle para leer todos los datos del archivo de forma, creo que mas rapida, que a traves del textbox.

De nuevo mil gracias PKJ


Function LeerRegistroTxt(ByVal NombreArchivo As String, ByVal numLinea As Long, Optional ByVal numColumna As Long) As String
Dim NumFichero As Integer
Dim Linea As String
On Error GoTo ErrorLectura
NumFichero = FreeFile
Open NombreArchivo For Input As #NumFichero
Do Until EOF(NumFichero)
If numLinea = 0 Then Exit Do
Line Input #NumFichero, Linea
numLinea = numLinea - 1
Loop
Close #NumFichero

If numColumna > 0 Then
Dim Matriz() As String
Matriz = Split(Linea, vbTab)
Linea = Matriz(numColumna - 1)
End If
LeerRegistroTxt = Linea
Exit Function

ErrorLectura:
MsgBox Err.Description
Err.Clear

End Function

dim resultado(1000,1000)

Private Sub Command1_Click()
For i = 1 To 3
For j = 1 To 3
resultado(i,j) = LeerRegistroTxt(Form1.Text1, i, j)
Debug.Print resultado
Next
Next
End Sub
  #9 (permalink)  
Antiguo 05/11/2010, 06:01
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Obtener datos de un archivo de texto

En ese caso deberías modificar el código para leer todos los registros de una vez, ya que la función está diseñada para leer registros sueltos y aumenta mucho el trabajo si lo que quieres es cargar todo.
Puedes hacerlo todo en el propio command1:

Código vb:
Ver original
  1. Dim NumFichero As Integer
  2. Dim Linea As String
  3. Dim Matriz() As String
  4. On Error GoTo ErrorLectura
  5. NumFichero = FreeFile
  6. Open Text1.Text For Input As #NumFichero
  7. Do Until EOF(NumFichero)
  8.   Line Input #NumFichero, Linea
  9.   Matriz=Split(Linea,vbTab)
  10.   i=i+1
  11.   For j = 0 To 2
  12.      resultado(i,j+1)=Matriz(j)
  13.   Next j
  14. Loop
  15. Close #NumFichero
  16.  
  17. Exit Sub
  18.  
  19. ErrorLectura:
  20. MsgBox Err.Description
  21. Err.Clear

Algo así...

En este caso es innecesario dado que solo hay 3 líneas y 3 datos, pero si automatizas el tema para manipular muchos ficheros o usas la función con ficheros con muchos datos, el proceso se comenzará a hacer pesado.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 05/11/2010 a las 06:17
  #10 (permalink)  
Antiguo 05/11/2010, 12:12
 
Fecha de Ingreso: noviembre-2010
Mensajes: 6
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: Obtener datos de un archivo de texto

Pues fenomenal PKJ, como me lo sigas mejorando me voy a quedar con las ganas de mandarte un jamon...

Otras mil Gracias y Salud.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:55.