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

leer archivo csv, transformar datos y crear un nuevo csv

Estas en el tema de leer archivo csv, transformar datos y crear un nuevo csv en el foro de Visual Basic clásico en Foros del Web. Hola, Soy novato en VB 6.0 y quería leer un archivo csv, y utilizando los datos de campos concretos (no utilizaría toda la información), crear ...
  #1 (permalink)  
Antiguo 13/10/2010, 16:09
 
Fecha de Ingreso: septiembre-2008
Mensajes: 113
Antigüedad: 16 años, 1 mes
Puntos: 1
leer archivo csv, transformar datos y crear un nuevo csv

Hola,
Soy novato en VB 6.0 y quería leer un archivo csv, y utilizando los datos de campos concretos (no utilizaría toda la información), crear otro archivo csv.

He visto un post donde se acerca lo que quiero, pero, por ejemplo, no desarrolla el como utilizar los datos de un campo en concreto, no dice como dividir la línea en cada uno de los registros del campo

http://www.forosdelweb.com/2590739-post177.html

¿como se haría? gracias
__________________
Genética animal y veterinaria
  #2 (permalink)  
Antiguo 15/10/2010, 15:03
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Hola, te dejo un ejemplo de como cargar los datos de un CSV en un FlexGrid, que probablemente te ayude o por lo menos te aporte ideas.

Código vb:
Ver original
  1. Private Sub CargarCSV(Grid As MSFlexGrid, FicheroCSV As String, Optional Separador As String = ";")
  2.   ' Carga en un FlexGrid un fichero en formato CSV
  3.  Dim Fichero As Integer, Registro As String, Campos() As String, Fila As Single, Columna As Single
  4.   ' Abrimos el fichero de Texto
  5.  Fichero = FreeFile
  6.   Open FicheroCSV For Input As #Fichero
  7.   ' Lo procesamos hasta el final
  8.  While Not EOF(Fichero)
  9.     ' Leemos un Registro y lo separamos en Campos individuales
  10.    Line Input #Fichero, Registro
  11.     Campos = Split(Registro, Separador)
  12.     ' Si es la primera Lectura (Fila=0) dimensionamos adecuadamente el Grid
  13.    If Fila = 0 Then
  14.       Grid.Clear                      'Lo borramos
  15.      Grid.FixedCols = 0              'Numero de Columnas fijas
  16.      Grid.FixedRows = 1              'Numero de Filas Fijas (Titulos)
  17.      Grid.Rows = 1                   '1 Fila
  18.      Grid.Cols = UBound(Campos) + 1  'Columnas +1
  19.    End If
  20.     ' Control de Fila a utilizar, se añade si es necesario
  21.    If Grid.Rows <= Fila Then Grid.Rows = Fila + 1
  22.     ' Situamos una a una las Columnas.
  23.    For Columna = 0 To UBound(Campos)
  24.       Grid.TextMatrix(Fila, Columna) = Campos(Columna)
  25.     Next
  26.     ' Aumentamos número de Fila
  27.    Fila = Fila + 1
  28.   Wend
  29.   Close #Fichero
  30. End Sub

Cualquier duda, comentamos.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #3 (permalink)  
Antiguo 17/10/2010, 10:16
 
Fecha de Ingreso: septiembre-2008
Mensajes: 113
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Cita:
Iniciado por erbuson Ver Mensaje
Hola, te dejo un ejemplo de como cargar los datos de un CSV en un FlexGrid, que probablemente te ayude o por lo menos te aporte ideas.

Saludos

Me ha salido así, mas o menos lo que yo quería. Pongo el código por si a alguien le es útil.

Hay dos variantes de archivo de salida, una con print y otra con write (da valores separados por comas, pero ojo, con un espacio.... no es un "csv como tal" separado por comas (,) o puntos y coma (;) (no se como conseguir esto)

Por si alguien lo sabe, pregunto como sería posible empezar a leer mi archivo de entrada, por ejemplo, desde la línea 6, no desde la primera línea

¿ y como conseguir que leyese sólo las filas pares desde la fila 6?


Código vb:
Ver original
  1. Sub ReadDelimitedTextFile()
  2.  
  3.       Dim LName As String, FName As String, Addr As String, City As String
  4.       Dim state As String
  5.       Dim age As Integer
  6.  
  7.      
  8.         Open "C:\Archivo1.txt" For Input As #1     ' Abrir el archivo para entrada de datos Input.
  9.    
  10.       ' Read each line of the text file into the list of variables  until the end of the file is reached.
  11.      
  12.       Do While Not (EOF(1))
  13.      
  14.          Input #1, LName, FName, age, Addr, City, state, zip
  15.        
  16. ' Area para trabajar con nuestros datos de los campos LName, FName, age, Addr, City, state, zip
  17. ' por ejemplo, vamos a sumar 5 a todas las edades
  18.  
  19. valor = age+5
  20.  
  21.  Open "C:\Archivo_salida.csv" For Append As #2
  22.  
  23.       Print #2, LName & ", " & FName & ", " & age & ", " & Addr & ", " _
  24.             & City & ", " & state & ", " & zip & ", " & valor
  25.      
  26.  Close #2    'Cerramos el archivo de salida
  27.  
  28. ' Igual pero con la opcion write, da los valores separados por comas y con un espacio
  29.  
  30.  Open "C:\Archivo_salida2.csv" For Append As #1
  31.  
  32.       Write #3, LName, FName, age, Addr, City, state, zip, valor
  33.  
  34.  Close #3 'Cerramos el archivo de salida2
  35.  
  36. Loop
  37.    
  38.       Close #1 'Cerramos el archivo de entrada
  39.            
  40. ' Unos mensajitos para avisar lo que se ha generado
  41. MsgBox "Se ha generado el archivo de salida " & Archivo_salida.csv
  42. MsgBox "Se ha generado el archivo de salida " & Archivo_salida2.csv
  43.          
  44. Unload Form1
  45. End Sub
Un modelo de el Archivo.txt tendría estos datos:
Smith,Juan,22,123 Main St,Nueva York,Argentina,32432
Pérez,Juan,33,324 Elm Avda.,San Diego,CA,23542
Adams,Bill,45,4523 roble CIR.,Miami,FL,52343
Jones,Tom,23,2335 Maple Dr.,Houston,Transmisión,23453

Gracias y saludos,
__________________
Genética animal y veterinaria

Última edición por buddyk9; 17/10/2010 a las 10:48
  #4 (permalink)  
Antiguo 17/10/2010, 11:18
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Hola:

La salida separada por ; como tu quieres, puedes conseguirla así:

Ejemplo:

Dim Dato As String, Numero As Integer
Dato = "Prueba"
Numero = 10
Open "C:\Prueba1.csv" For Output As #1
Print #1, Dato; ";"; Numero; ";"; Dato; ";"; Numero
Close #1
' Salida producida
' Prueba; 10 ;Prueba; 10

Al efectuar Print y poner detras de la variable el ; esta instrucción no deja caracteres entre y entre, el conseguir el ; separador es como ves imprimiendolo tambien.

El porque hay espacios cuando imprime un numero es implícito del Print y no puedes evitarlo, a no ser que conviertas el número en cadena, por ejemplo

Print Dato; ";"; Str(Numero); ";"; Dato

Fíjate que no ponemos al final el punto y coma porque si lo pusieramos los registros no tendrían entre ellos es CrLf que los separa.

En cuanto al tema de procesar según que registros, no puedes evitar tener que leerlos pero si puedes evitar grabarlos, creando un contador del registro leido por ejemplo y resumiendo tu código:

Dim Registro As Long
Do While Not (EOF(1))
Input #1, LName, FName, age, Addr, City, state, zip
Registro = Registro +1 'Porque hemos leido un registro completo
If Registro < 6 Then Goto Saltar ' Con esto no grabaremos del 1 al 5
If Registro Mod 2 = 1 Then Goto Saltar ' Saltaremos los registros impares
'
' Procesamos nuestros datos
'
Saltar:
Loop

Espero que haya quedado todo lo claro que pretendo, no obstante, cualquier duda, comenta.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #5 (permalink)  
Antiguo 17/10/2010, 12:23
 
Fecha de Ingreso: septiembre-2008
Mensajes: 113
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Cita:
Iniciado por erbuson Ver Mensaje
Hola:

La salida separada por ; como tu quieres, puedes conseguirla así:

Ejemplo:

Dim Dato As String, Numero As Integer
Dato = "Prueba"
Numero = 10
Open "C:\Prueba1.csv" For Output As #1
Print #1, Dato; ";"; Numero; ";"; Dato; ";"; Numero
Close #1
' Salida producida
' Prueba; 10 ;Prueba; 10

Al efectuar Print y poner detras de la variable el ; esta instrucción no deja caracteres entre y entre, el conseguir el ; separador es como ves imprimiendolo tambien.

El porque hay espacios cuando imprime un numero es implícito del Print y no puedes evitarlo, a no ser que conviertas el número en cadena, por ejemplo

Print Dato; ";"; Str(Numero); ";"; Dato

Fíjate que no ponemos al final el punto y coma porque si lo pusieramos los registros no tendrían entre ellos es CrLf que los separa.

En cuanto al tema de procesar según que registros, no puedes evitar tener que leerlos pero si puedes evitar grabarlos, creando un contador del registro leido por ejemplo y resumiendo tu código:

Dim Registro As Long
Do While Not (EOF(1))
Input #1, LName, FName, age, Addr, City, state, zip
Registro = Registro +1 'Porque hemos leido un registro completo
If Registro < 6 Then Goto Saltar ' Con esto no grabaremos del 1 al 5
If Registro Mod 2 = 1 Then Goto Saltar ' Saltaremos los registros impares
'
' Procesamos nuestros datos
'
Saltar:
Loop

Espero que haya quedado todo lo claro que pretendo, no obstante, cualquier duda, comenta.

Saludos
Preguntaba lo de empezar en la línea 6 (o en otra), porque en mi archivo de entrada, en las primeras líneas, no guardan la estructura de variable1, variable2, variable3, etc, con lo que da error...
Una variante que he encontrado es coger toda la línea con FileInput, y luego mediante split separar los registros en variables.... pero no se como sería...
Gracias por tu ayuda
__________________
Genética animal y veterinaria
  #6 (permalink)  
Antiguo 17/10/2010, 13:30
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Hola, de nuevo. Haber empezado por ahí, es igualmente facil. Te cuento con un ejemplo con comentarios.

Código vb:
Ver original
  1. Dim Dato() As String
  2. Dim RegistroCompleto As String
  3. Dim Registro As Long
  4. Dim Nombre As String, Poblacion As String, Fecha As Date, Importe As Currency
  5.  
  6. Do While Not EOF(1)
  7.   ' Supongamos que lees este Registro
  8.  ' Jose;12/04/1980;Madrid;1280
  9.  Line Input #1, RegistroCompleto     ' Leemos una linea completa
  10.  Registro = Registro + 1             ' Contador de Registros leidos
  11.  ' De este modo no tiene importancia los campos contenidos en el Registro
  12.  If Registro < 6 Then GoTo NoProcesarlo
  13.   ' Aqui puedes aplicar la comparación de Par/Impar, etc
  14.  Dato = Split(RegistroCompleto, ";") ' Separamos el registro en un array
  15.  ' Aqui tenemos los siguientes valores
  16.  ' Dato(0) = "Jose"
  17.  ' Dato(1) = "12/04/1980"
  18.  ' Dato(2) = "Madrid"
  19.  ' Dato(3) = "1280"
  20.  ' Otra posible comparación aqui sería con un dato en concreto por ejemplo
  21.  If Dato(0) <> "Jose" Then Goto NoProcesarlo   ' Por supuesto es un ejemplo
  22.  ' Pasamos por ejemplo los datos a nuestras variables
  23.  Nombre = Dato(0)
  24.   ' Verificamos que el valor leido es una fecha para evitar un posible error
  25.  If IsDate(Dato(1)) Then Fecha = CDate(Dato(1))
  26.   Poblacion = Dato(2)
  27.   ' Verificamos que el valor leido es un numero para evitar posibles errores
  28.  If IsNumeric(Dato(3)) Then Importe = CCur(Dato(3))
  29.   ' ...
  30.  ' ...
  31. NoProcesarlo:
  32.   Loop

Si necesitas mas aclaraciones las comentamos.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #7 (permalink)  
Antiguo 17/10/2010, 15:01
 
Fecha de Ingreso: septiembre-2008
Mensajes: 113
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Cita:
Iniciado por erbuson Ver Mensaje
Hola, de nuevo. Haber empezado por ahí, es igualmente facil. Te cuento con un ejemplo con comentarios.
Si necesitas mas aclaraciones las comentamos.

Saludos
Me está siendo muy útil tu ayuda para adaptar mi script. Me encuentro algunos problemas que no consigo solucionar.
Hay valores que son numéricos (con un punto por separador decimal), que sólo me coje el valor entero, no los decimales.

A partir del Dato(5), puede no haber dato, con lo cual, me da un
"Error 13 en el tiempo de ejecución, no coinciden los tipos".

Si activo el "on error resume next", resulta que hay veces que tengo dato en la variable 7 (el mas importante), que no me lo coje...

Muchas Gracias
__________________
Genética animal y veterinaria

Última edición por buddyk9; 17/10/2010 a las 15:02 Razón: editar tipografia
  #8 (permalink)  
Antiguo 17/10/2010, 15:39
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Hola:
En primer lugar, si hay campos que pueden no existir, debes comprobar antes el valor máximo del array, por ejemplo y volviendo al ejemplo anterior:

Juan;12/04/2010;Madrid;1025.33
Jose;15/06/1980;Malaga

En este caso el 2º registro no tendra Dato(3) y para evitar el error podrias hacer algo así:

Dato = Split(RegistroCompleto, ";")
...
...
If Ubound(Dato) => 3 Then
Importe = CCur(Dato(3))
' Si aqui es donde te produce el error el que tenga el punto decimal
' tal vez sea conveniente que utilices
Importe = Val(Dato(3))
Else
Importe = 0
End If

El problema en el tema de la conversión a numeros es que si tienes la certeza de que la cifra contiene el . (punto) decimal es mejor que utilices val, pero si el separador decimal que contiene coincide con el separador de la configuración regional, en España la , (coma) entondes si que puedes utilizar CCur, CDbl o CSng

Este punto te conviene experimentarlo para saber cual te da buen resultado, dependiendo de las circunstancias en que va a utilizarse tu programa.

En cuanto al On Error Resume Next, realmente debería funcionarte pero ten en cuenta que si hay casos en que puedas o no tener valores, tal vez lo mejor es que después de grabar los valores y antes de reasignarlos con el registro nuevo leido, deberias inicializarlos. Me explico, volviendo al ejemplo de arriba y suponiendo que tienes activado el On Error Resume Next, al grabar el segundo registro la variable Importe debería contener el mismo valor que en el primero ya que al producirse el error, no se efectua la asignación.

Despues de procesar el 1º el campo importe es 1025,33 y seguimos con el segundo

Importe = CCur(Dato(3))

Como se produce el error no se reasigna Importe por lo tanto su valor se mantiene.

Dices por otra parte que hay veces que tienes datos en 7 lo impòrtante es que la estructura debe mantenerse o de lo contrario debes tomar las medidas adecuadas, por ejemplo:

Juan;12/04/2010;Madrid;1025.33;15
Jose;15/06/1980;Malaga;;16

En este caso en el segundo registro no existe Dato(3) pero si existe el espacio que ocuparia por lo que Dato(4) tendrá siempre el valor correspondiente.

Espero haberme explicado debidamente.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #9 (permalink)  
Antiguo 19/10/2010, 12:46
 
Fecha de Ingreso: septiembre-2008
Mensajes: 113
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Cita:
Iniciado por buddyk9 Ver Mensaje

A partir del Dato(5), puede no haber dato, con lo cual, me da un
"Error 13 en el tiempo de ejecución, no coinciden los tipos".

Muchas Gracias
Este eror lo solucioné, haciendo los valores numéricos tomando las variables como variable4 = Val(Dato(4))

Ahora se me plantea la duda siguiente:

Realmente, mis datos van en dos filas, hay dos entradas por dato, en la primera tengo el nombre (y otras variables que no me interesan), y en la fila siguiente, en la columna 7, la variable con la que mas me interesa rescatar...
Si voy leyendo por filas, al no estar en la misma, no puedo leerlas, no puedo "conectarlas", para que luego en mi salida, obtenga el nombre, variable(de la columna 7).
voy a trabajar con unos 100 registros (unas 200 filas) con 8 variables por fila, y no se si se podría construir una matriz, y luego, como en excel, similar a un ActiveCell (1,7), recuperar el valor que está una fila mas hacia abajo y 7 celdas mas hacia la derecha...
es decir la estructura de mis datos sería (mas o menos):
fila1:nombre, dato1, dato2, dato3, dato4,
fila2: dato5, dato6, dato7, dato8, dato9
y me interesa capturar "nombre" y "dato8"
¿alguna idea?
Gracias
__________________
Genética animal y veterinaria
  #10 (permalink)  
Antiguo 19/10/2010, 13:04
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Hola, puedes leer dos registros cada vez antes de efectuar el split, después tomar las 'columnas' que necesites y grabarlos en el fichero de Salida, por lo que veo tienes una (,) coma al final de Fila1 así puedes hacer:

Dim Fila1 As String, Fila2 As String

Line Input #1, Fila1
Line Input #1, Fila2

Dato = Split(Fila1 & Fila2, ",")

Esto es un poco la idea, si no lo ves claro, lo comentamos un poco mas tarde que tengo que salir un momento pitando.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...

Última edición por erbuson; 19/10/2010 a las 14:02
  #11 (permalink)  
Antiguo 20/10/2010, 12:50
 
Fecha de Ingreso: septiembre-2008
Mensajes: 113
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

La cosa se complica un poco, porque, como he comentado, mi fichero de entrada tiene una serie de líneas que no quiero leer (o por lo menos, puedo no grabar), y cuando quiero leer los datos, estos han de ser de dos en dos, lo cual habiamos resuelto leyendo dos filas a la vez con:

Line Input #4, Fila1
Line Input #4, Fila2

El problema es que al ser las líneas "previas que no quiero leer" impares, y leer en bucles de 2 para cada registro con

Dato = Split(Fila1 & Fila2, ",")

me está leyendo una línea de un registro (la línea 2) y la primera del siguiente, con lo cual, al unirlos salen los datos mezclados.

No se como hacerlo para que empiece a leer una linea antes o otra despues...

lo he intentado creando un archivo, sobre el que escribo una línea, y luego leo el archivo con el que quiero trabajar (con lo que le tendría con una línea mas)... y luego quería volvera a leerlo de nuevo, pero me da problemas.
¿como podría conseguirlo?
MUchas gracias
__________________
Genética animal y veterinaria
  #12 (permalink)  
Antiguo 20/10/2010, 14:26
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Hola, sabes cuantas son las lineas que no debes procesar, voy a resumirte lo que podrías hacer:

Open "ElFichero" For Input As #4
' Efectuamos un bucle de lectura para forzar a leer los registros que no queremos
For Salta = 1 to 5 '
Line Input #4, Registro
Next
Do While not Eof(4)
Line Input #4, Linea1
Line Input #4, Linea2
...
...
Loop
Close #4

Esto sería un poco la idea que como ves es bastante simple y supongo captarás enseguida.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #13 (permalink)  
Antiguo 21/10/2010, 12:32
 
Fecha de Ingreso: septiembre-2008
Mensajes: 113
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Muchas gracias por tu ayuda
Gracias a tus indicaciones he conseguido lo que quería de mi script.
Espero seguir avanzando en el conocimiento de VB y no tener que preguntar "tanto" (y con el tiempo, ayudar a otros).

Saludos,
__________________
Genética animal y veterinaria
  #14 (permalink)  
Antiguo 21/10/2010, 15:30
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Hola, es estupendo que al final te haya funcionado, como ves con teson y ganas, casi todo puede conseguirse.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #15 (permalink)  
Antiguo 04/02/2014, 10:54
 
Fecha de Ingreso: febrero-2014
Mensajes: 1
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

hola estoy que trato abrir un archivo csv que tiene varias columnas y estan separados por ;, pasarlo a un excel en columnas "normales " hasta ahora, nada, solo he podido abrir el archivo con un explorador porque tengo que abrir un archivo diferente cada dia, pero nada, alguno tiene algun dato? gracias!!Es excel 2010
  #16 (permalink)  
Antiguo 05/02/2014, 15:29
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: leer archivo csv, transformar datos y crear un nuevo csv

Hola:
El archivo CSV lo puedes abrir directamente desde EXCEL o con EXCEL y automaticamente te lo encolumna.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...

Etiquetas: csv, transformar
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 07:30.