Page 1 of 1
Obtener datos de archivo csv
Posted: Fri Feb 12, 2021 6:08 pm
by jparada
Hola,
Tengo la necesidad de extraer información de un archivo csv (que es un estado de cuenta bancario), he leído algunos post aquí en el foro pero honestamente no entiendo cómo obtener lo que requiero,
El archivo tiene la siguiente estructura, el separador es la coma
, y lo que veo es que cuando la línea del archivo tiene
"", significa que es información extra de la línea anterior (no sé si me explico), algo así:
jparada wrote:01/DIC,V43 COMISION VENTAS DEBITO,83.00,
"",TERMINALES PUNTO DE VENTA Ref. 176533301,,
01/DIC,V44 IVA COM. VENTAS DEBITO,13.28,
"",TERMINALES PUNTO DE VENTA Ref. 176533301,,
01/DIC,V40 CUOTA TRANSACCION EXITOSA,5.85,
"",EN TERMINAL PUNTO DE VENTA (TPV) Ref. 6533301,,
01/DIC,V41 IVA TRANSACCION EXITOSA,0.94,
"",Ref. 6533301,,
01/DIC,T20 SPEI RECIBIDOBANAMEX,,610.00
"",0011220CUBETA DE ACEITE HIDRAULICO Ref. 0126531203 002,,
"",00002813700841191702,,
"",085900270934333609,,
"",INCOPROSA SA DE CV,,
01/DIC,T20 SPEI RECIBIDOBANORTE,,"12,865.41"
"",0000001PAGO DE FACTURA Ref. 0126562594 072,,
"",00072813003165629687,,
"",7875APR2202012011136981473,,
"",ERIC ALEJANDRO CHAVEZ LUNA,,
01/DIC,T20 SPEI RECIBIDOBANORTE,,"1,460.71"
"",0011220Cotizacion CFA 14061 Ref. 0126569741 072,,
"",00072813010533320433,,
"",8846APR1202012011136985412,,
"",INGENIERIA EN PROYECTOS DE VIALIDAD SA D,,
entonces debo leer
primer delimitador - fecha
segundo delimitador - descripción +
por lo menos primer línea que empieza en el salto de línea
tercer delimitador - es un cargo
cuarto delimitador - es un abono
Alguna idea cómo puedo obtener los valores que requiero?, estoy utilizando para abrir y leer el archivo TFileRead.
Saludos,
Javier
Re: Obtener datos de archivo csv
Posted: Fri Feb 12, 2021 6:40 pm
by andyglezl
Hola Javier
Si los campos de cada línea son variables, el banco debería indicarte
el formato en el que están y como identificarlos.
Si son fijos, con un APPEND a una dbf sería suficiente.
*-----------------------------------------------------------------------------------------
Hi Javier
If the fields of each line are variable, the bank should tell you
the format in which they are and how to identify them.
If they are fixed, an APPEND to a dbf would be enough.
Hay algunos líneas que terminan en "," y otros no
Hay valores numéricos entre comillas y otros no
Re: Obtener datos de archivo csv
Posted: Fri Feb 12, 2021 8:08 pm
by martingz
Jparada tengo este codigo, lo uso para procesar un achivo csv delimitado por "," y cargarlo a un grid, espero te sirva
cstring:=MEMOREAD(vararchivo)
nlines:=MLCOUNT(cstring,180)
for h = 2 to (nlines)
registro:=alltrim(MEMOLINE(cstring , 180, h))
if !empty(alltrim(registro))
lugar1:=RAT(',',registro)
varsueldoq:=val(right(registro,len(registro) - lugar1))
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
vardias:=val(right(registro,len(registro) - lugar1))
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
varsalarioo:=val(right(registro,len(registro) - lugar1))
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
varrfc:=right(registro,len(registro) - lugar1)
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
varcurp:=right(registro,len(registro) - lugar1)
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
varnom:=right(registro,len(registro) - lugar1)
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
varnum:=right(registro,len(registro) - lugar1)
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
varper2:=alltrim(right(registro,len(registro) - lugar1))
varper2:=right(varper2,2) + '/' + right(left(varper2,7),2) + '/' + left(varper2,4)
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
varper1:=alltrim(right(registro,len(registro) - lugar1))
varper1:=right(varper1,2) + '/' + right(left(varper1,7),2) + '/' + left(varper1,4)
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
varfecha:=right(registro,len(registro) - lugar1)
varfecha:=right(varfecha,2) + '/' + right(left(varfecha,6),2) + '/' + left(varfecha,4)
endif
next
saludos
Re: Obtener datos de archivo csv
Posted: Fri Feb 12, 2021 10:05 pm
by danielmaximiliano
Tu registro esta conformado asi
01/DIC,V43 COMISION VENTAS DEBITO,83.00,"",TERMINALES PUNTO DE VENTA Ref. 176533301,,
01/DIC,V44 IVA COM. VENTAS DEBITO,13.28,"",TERMINALES PUNTO DE VENTA Ref. 176533301,,
01/DIC,V40 CUOTA TRANSACCION EXITOSA,5.85,"",EN TERMINAL PUNTO DE VENTA (TPV) Ref. 6533301,,
Fecha, descripcion, monto,xxx, descripción, xxx
APPEND FROM <cvsFileSpec> DELIMITED
mirar aqui
http://www.hmgforum.com/viewtopic.php?t=1615
Re: Obtener datos de archivo csv
Posted: Fri Feb 12, 2021 11:17 pm
by jparada
martingz wrote: ↑Fri Feb 12, 2021 8:08 pm
Jparada tengo este codigo, lo uso para procesar un achivo csv delimitado por "," y cargarlo a un grid, espero te sirva
cstring:=MEMOREAD(vararchivo)
nlines:=MLCOUNT(cstring,180)
for h = 2 to (nlines)
registro:=alltrim(MEMOLINE(cstring , 180, h))
if !empty(alltrim(registro))
lugar1:=RAT(',',registro)
varsueldoq:=val(right(registro,len(registro) - lugar1))
registro:=left(registro,lugar1 - 1 )
lugar1:=RAT(',',registro)
vardias:=val(right(registro,len(registro) - lugar1))
next
Gracias Martin, esto es más parecido a lo que requiero, al parecer tengo que jugar con las funciones como las que me muestras aquí pero también con SubStr, etc.
Por el momento no estoy enviando el contenido a ningún dbf sólo quiero leer el contenido del archivo.
Seguro seguiré molestando con éste tema por acá.
Saludos,
Javier
Re: Obtener datos de archivo csv
Posted: Sat Feb 13, 2021 1:11 am
by martingz
Javier si en algo puedo ayuidar con mucho gusto
saludos
Re: Obtener datos de archivo csv
Posted: Tue Feb 23, 2021 3:48 am
by jparada
Hola,
Gracias a su ayuda he ido avanzando...
El reto que tengo ahora y que aún no sé cómo solucionar o si la solución para por algo complejo es que tenemos los movimientos bancarios algo así:
Code: Select all
01/DIC,N06 PAGO CUENTA DE TERCERO,1517.3,0
"",BNET 0197234848 MAYRA H Ref. 0016562026,0,0
01/DIC,T20 SPEI RECIBIDOBANORTE,1542.43,0
"",0011220B IHSA REFACC COMPRESOR Ref. 0127105735 072,0,0
"",00072580002885258730,0,0
"",8846APR1202012011137943990,0,0
"",GRUPO ZUDREM SA DE CV,0,0
01/DIC,AA7 DEPOSITO EFECTIVO PRACTIC,1067,0
"",EFECTIVO 3457 FOLIO:6742 Ref. ******6587,0,0
02/DIC,C07 DEP.CHEQUES DE OTRO BANCO,2343.1,0
"",C07 Ref. 57010785240,0,0
la línea que incluye la fecha es la del encabezado por decir y las líneas que inician con "" es el detalle, haciendo el recorrido del archivo cómo puedo condicionar que si la línea comienza con "" es el detalle y entonces concatenar con la descripción, por ejemplo, obtener algo así:
01/DIC,
N06 PAGO CUENTA DE TERCERO BNET 0197234848 MAYRA H Ref. 0016562026,0,0,1517.3,0
lo que he visto es que se puede decir que el detalle siempre es un máximo de 4 líneas.
Alguna idea que puedan compartir.
Saludos,
Javier
Re: Obtener datos de archivo csv
Posted: Tue Feb 23, 2021 7:38 am
by SALINETAS24
jparada wrote: ↑Tue Feb 23, 2021 3:48 am
Hola,
Gracias a su ayuda he ido avanzando...
El reto que tengo ahora y que aún no sé cómo solucionar o si la solución para por algo complejo es que tenemos los movimientos bancarios algo así:
Code: Select all
01/DIC,N06 PAGO CUENTA DE TERCERO,1517.3,0
"",BNET 0197234848 MAYRA H Ref. 0016562026,0,0
01/DIC,T20 SPEI RECIBIDOBANORTE,1542.43,0
"",0011220B IHSA REFACC COMPRESOR Ref. 0127105735 072,0,0
""
lo que he visto es que se puede decir que el detalle siempre es un máximo de 4 líneas.
Alguna idea que puedan compartir.
Saludos,
Javier
Hola Javier, creo que estas muy cerca....
Si el modelo de fichero que has enviado al principio es el correcto, tal y como dice Daniel y una vez analizado verás que el final de la línea te la marcan dos comas seguidas ",,". ¡¡ojo!! AL FINAL DE LA LINEA, y el principio de la linea de observaciones dos '""' seguidas....
La solución.., si yo estoy en lo cierto sería algo como esto
Code: Select all
STATIC FUNC MontarLinea(cFichero)
LOCAL aCadena:={}
LOCAL cLinea, nFor
aCadena := HB_ATOKENS( MEMOREAD( cFichero ), CRLF )
cLinea:=""
FOR nFor= 1 TO LEN(aCadena)
DO CASE
CASE LEFT(aCadena[nFor],2)!='""' // Si es una de las lineas de Inicio
IF !EMPTY(cLinea)
// Compruebo si Tengo ya algo cargado en la línea y puedo procesarla
MSGBOX(cLinea)
cLinea:=""
ENDIF
cLinea:=aCadena[nFor]
OTHERWHISE
// Quito las dos comas del final
aCadena[nFor]=ALLTRIM(SUBSTR(aCadena[nFor],1,LEN(aCadena[nFor]-2))
// Añado la linea quitando las dos comillas del principio
cLinea+=","+SUBSTR(aCadena[nFor],3)
ENDCASE
NEXT
IF !EMPTY(cLinea) // Por si tengo algo en ultima linea
MSGBOX(cLinea)
ENDIF
RETURN
Ya me dices si lo puedes cuadrar...., y ahora una cervecita fresquita !!

Re: Obtener datos de archivo csv
Posted: Wed Feb 24, 2021 7:31 am
by SALINETAS24
jparada wrote: ↑Fri Feb 12, 2021 6:08 pm
Hola,
Tengo la necesidad de extraer información de un archivo csv (que es un estado de cuenta bancario), he leído algunos post aquí en el foro pero honestamente no entiendo cómo obtener lo que requiero,
El archivo tiene la siguiente estructura, el separador es la coma
, y lo que veo es que cuando la línea del archivo tiene
"", significa que es información extra de la línea anterior (no sé si me explico), algo así:
jparada wrote:01/DIC,V43 COMISION VENTAS DEBITO,83.00,
"",TERMINALES PUNTO DE VENTA Ref. 176533301,,
01/DIC,V44 IVA COM. VENTAS DEBITO,13.28,
"",TERMINALES PUNTO DE VENTA Ref. 176533301,,
01/DIC,V40 CUOTA TRANSACCION EXITOSA,5.85,
"",EN TERMINAL PUNTO DE VENTA (TPV) Ref. 6533301,,
01/DIC,V41 IVA TRANSACCION EXITOSA,0.94,
"",Ref. 6533301,,
01/DIC,T20 SPEI RECIBIDOBANAMEX,,610.00
"",0011220CUBETA DE ACEITE HIDRAULICO Ref. 0126531203 002,,
"",00002813700841191702,,
"",085900270934333609,,
"",INCOPROSA SA DE CV,,
01/DIC,T20 SPEI RECIBIDOBANORTE,,"12,865.41"
"",0000001PAGO DE FACTURA Ref. 0126562594 072,,
"",00072813003165629687,,
"",7875APR2202012011136981473,,
"",ERIC ALEJANDRO CHAVEZ LUNA,,
01/DIC,T20 SPEI RECIBIDOBANORTE,,"1,460.71"
"",0011220Cotizacion CFA 14061 Ref. 0126569741 072,,
"",00072813010533320433,,
"",8846APR1202012011136985412,,
"",INGENIERIA EN PROYECTOS DE VIALIDAD SA D,,
entonces debo leer
primer delimitador - fecha
segundo delimitador - descripción +
por lo menos primer línea que empieza en el salto de línea
tercer delimitador - es un cargo
cuarto delimitador - es un abono
Alguna idea cómo puedo obtener los valores que requiero?, estoy utilizando para abrir y leer el archivo TFileRead.
Saludos,
Javier
Hola Javier, en base a los datos que nos facilitas, te paso el código para obtener la información.
Queda este código almacenado en un Array para que puedas grabarlo, mostrarlo en un Grid, etc.
Recibe un cordial saludo.
Code: Select all
FUNCTION Main()
LOCAL line
LOCAL fileName := 'javo.csv'
LOCAL aTokens
LOCAL t
LOCAL cArchivo := 'resultado.log'
LOCAL lNuevo
LOCAL aData := {}
LOCAL detail := ""
LOCAL aDes[4] // CONTENDRA LA DESCRIPCION -- hasta 4
LOCAL nDes:=3 // Variable de 1 a 4 ¿Cuantas descripciones quieres ...?
LOCAL nContador // Para saber por que descripcion vamos
LOCAL x // Para el nuevo bucle
LOCAL nPos // Para saber la posición del registro aData
buffer := HB_UTF8ToStr( MemoRead( fileName ) )
nLineas := MLCount( buffer )
nPos:=nContador:=0
FOR nLin:=1 TO nLineas
linea := RTrim( MemoLine( buffer, NIL, nLin ) )
aTokens := hb_ATokens(linea,',',.T.)
// Como lo tienes así, lo primero que veo es si es una descripcion
// y en caso afirmativo me la guardo, tantas como las indicadas en "nDes"
IF '""' $ linea
IF nContador <= nDes // Si es menor o igual paso al array aDes
nContador ++ // Sumo 1 para saber cuantas llevo
// Comprueba si es aTokens[1.2..3] donde esta la descripción
aDes[nContador]:=aTokens[2] // Se supone que cargo la descripcion aTokens[2]
ENDIF
ELSE
// Estoy en una linea de cabecera de principio
// Si nContador vale algo, es que ya he pasado por aqui y tengo algo en descripción
// Tengo que actualizar
IF nContador!=0
// Ahora voy a unir la descripción
FOR x=1 TO nContador // Es el nº de descripciones que tiene cargadas
aData[nPos][2]+=" "+aDes[x]
NEXT
ENDIF
nContador:=0 // Pongo el contador a Cero de Descripciones
AAdd( aData, { aTokens[1], aTokens[2], aTokens[3], aTokens[4] } )
nPos++ // Actualizo posicion de aData
ENDIF
NEXT
// Cuando termina es posible que tenga la ultima linea sin actualizar
IF nContador!=0 // Ya he leido algo, tengo que actulizar
FOR x=1 TO nDes // Es el nº de descripciones que quieres
aData[nPos][2]+=" "+aDes[x]
NEXT
ENDIF
// Ahora ya se supone que tienes en aData un array con los campos
msgdebug(aData)
? 'Terminado...'
RETURN NIL
Re: Obtener datos de archivo csv
Posted: Wed Feb 24, 2021 6:35 pm
by jparada
SALINETAS24 wrote: ↑Wed Feb 24, 2021 7:31 am
Hola Javier, en base a los datos que nos facilitas, te paso el código para obtener la información.
Queda este código almacenado en un Array para que puedas grabarlo, mostrarlo en un Grid, etc.
Recibe un cordial saludo.
Hola José, muchas Gracias por tu tiempo y por tu ayuda, estoy haciendo las primeras pruebas con tu código y al parecer funciona como se espera.
Te envío una cervecita virtual pero también te ganaste un jamón Jabugo
Saludos,
Javier