Obtener datos de archivo csv

HMG en Español

Moderator: Rathinagiri

Post Reply
jparada
Posts: 341
Joined: Fri Jan 23, 2009 5:18 pm
Has thanked: 3 times
Been thanked: 10 times

Obtener datos de archivo csv

Post 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

User avatar
andyglezl
Posts: 1322
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Has thanked: 43 times
Been thanked: 148 times
Contact:

Post 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
Andrés González López
Desde Guadalajara, Jalisco. México.

martingz
Posts: 324
Joined: Wed Nov 18, 2009 11:14 pm
Location: Mexico
Has thanked: 49 times
Been thanked: 26 times

Post 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

User avatar
danielmaximiliano
Posts: 2447
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Has thanked: 552 times
Been thanked: 117 times
Contact:

Post 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
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO

jparada
Posts: 341
Joined: Fri Jan 23, 2009 5:18 pm
Has thanked: 3 times
Been thanked: 10 times

Post 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

martingz
Posts: 324
Joined: Wed Nov 18, 2009 11:14 pm
Location: Mexico
Has thanked: 49 times
Been thanked: 26 times

Post by martingz »

Javier si en algo puedo ayuidar con mucho gusto


saludos

jparada
Posts: 341
Joined: Fri Jan 23, 2009 5:18 pm
Has thanked: 3 times
Been thanked: 10 times

Post 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

User avatar
SALINETAS24
Posts: 537
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 65 times
Been thanked: 81 times

Post 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 !! 8-)
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:

User avatar
SALINETAS24
Posts: 537
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Has thanked: 65 times
Been thanked: 81 times

Post 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


Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:

jparada
Posts: 341
Joined: Fri Jan 23, 2009 5:18 pm
Has thanked: 3 times
Been thanked: 10 times

Post 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 :lol:

Saludos,
Javier

Post Reply