FoxPro/Visual FoxPro - Recorrer un txt y quitar lineas con un valor determinado

 
Vista:

Recorrer un txt y quitar lineas con un valor determinado

Publicado por Favio Colman (2 intervenciones) el 25/05/2016 14:38:44
BUenas amigos, tengo el siguiente inconveniente. Estoy trabajando con un Padron de Contribuyentes del ARBA y pesa aprox. 200 megas, donde tiene el cuit o identificador del contribuyente y el porcentaje a retenerle.
Al ser tan pesado se me complica pasar a DBF. Pero se podria achicar el archivo si se elimina las lineas de los contribuyentes tienen porcentaje 0, que son muchos. La pregunta es, como recorro el txt gigante y elimino las filas que tienen valor cero en el porcentaje. Un dato mas, estan delimitados por punto y coma los datos en las filas del txt. Espero puedan ayudarme, desde ya muchas gracias.
Ejemplo del contenido del archivo, lo que esta en negrita es el porcentaje, de cuatro lineas 3 son en cero.
P;22032016;01042016;30042016;20000000028;D;N;N;6,00;15;
P;22032016;01042016;30042016;20000021742;D;S;N;0,00;01;
P;22032016;01042016;30042016;20000028070;D;S;N;0,00;01;
P;22032016;01042016;30042016;20000033481;D;S;N;0,00;01;
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Recorrer un txt y quitar lineas con un valor determinado

Publicado por Fidel José (657 intervenciones) el 26/05/2016 15:49:15
En realidad, los padrones son 2. Uno de percepciones y otro de retenciones.
Lo que sigue es un modelo, pero también depende de cómo pensás guardar y acceder a la información cuando se necesite.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
* Main
* Acá se colocan dos archivos de ejemplo, pero se supone que hay que buscarlos con GetFile()
 
LOCAL i,;
	lnAdd,;
	lnAvoid,;
	lnCount,;
	lnReemp,;
	loREsp AS Object
 
LOCAL ARRAY laFiles(2)
laFiles[1] = "c:\Sistemas\lprimos\Plancon\PadronRGSRet072014.txt"
laFiles[2] = "c:\Sistemas\lprimos\Plancon\PadronRGSPer072014.txt"
STORE 0 TO lnCount,lnAdd,lnReemp,lnAvoid
 
CREATE CURSOR curArba ;
("desde" d,;
"hasta" d,;
"cuit" c(13),;
"tipocon" c(1),;
"alicret" n(5,2),;
"alicper" n(5,2),;
"BajaRet" L ,;
"BajaPer" L )
 
SELECT curArba
INDEX on cuit TAG icuit
 
 
FOR i = 1 TO ALEN(laFiles)
	loResp = Read_arbatext(lafiles[i])
	IF VARTYPE(loResp) = "O"
		lnCount = m.lnCount + loResp.Count
		lnAdd = m.lnAdd + loResp.add
		lnReemp = m.lnReemp + loREsp.Reemp
		lnAvoid = m.lnAvoid + loResp.Avoid
	ENDIF
NEXT
 
MESSAGEBOX(TRANSFORM(lnCount)+" registros leídos" + CHR(13);
	+ TRANSFORM(RECCOUNT("curArba"))+" registros agregados." + CHR(13);
	+ TRANSFORM(m.lnAdd) + " Inserts."+CHR(13);
	+ TRANSFORM(lnreemp)+" reemplazos."+CHR(13);
	+ TRANSFORM(m.lnAvoid)+" registros sin alícuota")
 
 
SELECT curArba
GO top
BROWSE
USE IN curArba

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
PROCEDURE Read_Arbatext
LPARAMETERS tcFileTExt
TRY
	LOCAL lcCambio,;
		lcCuit,;
		lcCuitb,;
		lcField,;
		lcGet,;
		lcGrupo,;
		lcMovim,;
		lcRegimen,;
		lcTipocon,;
		ldDesde,;
		ldFepub,;
		ldHasta,;
		ln,;
		lnAliPer,;
		lnAliRet,;
		lnHand,;
		lnValAlic,;
		lnPas,;
		lnAdd,;
		lnCount,;
		loReturn as Object,;
		loex AS Exception
 
	WAIT "Leyendo "+m.tcFileText+"..." WINDOW AT 12,15 NOWAIT
	loReturn = NEWOBJECT("Empty")
	ADDPROPERTY(loReturn,"Count",0)
	ADDPROPERTY(loReturn,"Add",0)
	ADDPROPERTY(loREturn,"Reemp",0)
	ADDPROPERTY(loREturn,"Avoid",0)
 
	lnPas = 0
	lnCount = 0
	lnReemp = 0
 
 
*desde,hasta,cuit,tipocon,alicret,alicper,BajaRet,BajaPer
 
	lnHand = FOPEN(m.tcFileText)
	IF m.lnHand > -1
		DO WHILE !FEOF(m.lnHand)
			loREturn.Count = loReturn.Count + 1
			lnCount = m.lnCount + 1
			IF m.lnCount > 99999
				WAIT TRANSFORM(loREturn.Count)+" registros leidos..." WINDOW AT 12,15 NOWAIT
				lncount = 0
			ENDIF
			lcGet = ALLTRIM(FGETS(m.lnHand,2048))
			ln=ALINES(laLines,lcGet,1,";")
			lcRegimen=laLines[1]
			ldFePub=DATE(VAL(RIGHT(laLines[2],4)),VAL(SUBSTR(laLines[2],3,2)),VAL(LEFT(laLines[2],2)))
			ldDesde=DATE(VAL(RIGHT(laLines[3],4)),VAL(SUBSTR(laLines[3],3,2)),VAL(LEFT(laLines[3],2)))
			ldHasta=DATE(VAL(RIGHT(laLines[4],4)),VAL(SUBSTR(laLines[4],3,2)),VAL(LEFT(laLines[4],2)))
			lcCuitb=laLines[5]	&& 11 dig
			lcTipocon=laLines[6]	&& D Directo, C Convenio
			lcMovim=laLines[7]	&& S=Alta N=nada  B=Baja
			lcCambio=laLines[8]	&& S i o N o
			STORE 0 TO lnAliPer,lnAliREt
			STORE .f. TO lBajaPer, lBajaRet
 
 
			lcGrupo=laLines[10]
			lcCuit = Left(lcCuitB,2)+"-"+Substr(lcCuitB,3,8)+"-"+Right(lcCuitB,1)
			lBaja = m.lcMovim == "B"
			DO case
				CASE lcRegimen="R"
					lnAliRet=VAL(CHRTRAN(laLines[9],",","."))
					lcField = "AlicRet"
					lcFieldBaja = "BAJARET"
					lnValAlic = lnAliREt
					lBajaREt = m.lBaja
 
				CASE lcRegimen="P"
					lnAliPer=VAL(CHRTRAN(laLines[9],",","."))
					lcField = "AlicPer"
					lnValAlic = lnAliPer
					lcFieldBaja = "BAJAPER"
					lBajaPer = m.lBaja
			ENDCASE
 
			IF !EMPTY(m.lnValAlic)
				IF !INDEXSEEK(m.lcCuit,.f.,"curArba","icuit")
 
					INSERT INTO curArba ;
						(Desde,;
						Hasta,;
						Cuit,;
						Tipocon,;
						Alicret,;
						Alicper,;
						Bajaret,;
						Bajaper);
					VALUES ;
						(ldDesde,;
						ldHasta,;
						lcCuit,;
						lcTipocon,;
						lnAliret,;
						lnAliper,;
						lBajaret,;
						lBajaper)
 
					loReturn.Add = loREturn.ADd + 1
				ELSE
					SELECT curArba
					INDEXSEEK(m.lcCuit,.t.,"curArba","icuit")
					replace (m.lcField) WITH m.lnValAlic ,;
						(lcFieldBaja ) WITH m.lBaja
 
					loREturn.REemp = loREturn.Reemp + 1
				ENDIF
			ELSE
				loREturn.Avoid = loREturn.Avoid + 1
			ENDIF
 
		ENDDO
	ENDIF
CATCH TO loex
	loex.UserValue = PROGRAM()
	MESSAGEBOX("Se produjo un error en "+CHR(13);
		+ loex.UserValue + CHR(13);
		+ loex.Message ;
		+ IIF(_vfp.StartMode = 0,+CHR(13)+"Linea "+ TRANSFORM(loex.LineNo),""))
FINALLY
	WAIT CLEAR
	IF m.lnHand # -1
		=FCLOSE(m.lnHand)
	ENDIF
ENDTRY
RETURN loREturn
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

Recorrer un txt y quitar lineas con un valor determinado

Publicado por Favio Colman (2 intervenciones) el 26/05/2016 18:36:00
Hola Fidel, lo voy a probar y te aviso. Desde ya muchas gracias por el aporte.
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

Recorrer un txt y quitar lineas con un valor determinado

Publicado por Horacio (1 intervención) el 31/08/2017 16:19:07
Hola Fabio,
en primer lugar, de ninguna manera debes evitar la carga de los que tienen 0 en la tasa, ya que es la única manera de saber que NO debes retenerle. Aquellos que no figuran en padrón se les aplica la tasa máxima. Debes leer bien las resoluciones.
En segundo lugar con una sentencia append from , la carga se hace sola y muy rápidamente.
Eso sí, en el dbf debes eliminar todos aquellos cuya fecha_hasta sea anterior al dìa de la la carga.
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

Recorrer un txt y quitar lineas con un valor determinado

Publicado por Abel (3 intervenciones) el 01/09/2017 18:56:18
Un código más simple para hacerlo..

1
2
3
4
5
6
7
8
9
cArchivo = GETDIR()
cDatos    = FILETOSTR(cArchivo)
cNuevo   = ""
FOR nx=1 to ALINES(aLineas,cDatos)
	IF VAL(GETWORDNUM(ab,9,";"))#0
		cNuevo = cNuevo+aLineas(nx)+CHR(13)+CHR(10)
	endif
NEXT
STRTOFILE(cNuevo,"Resultado.txt")

Esto hace que lea línea a línea dentro del archivo plano; comprueba que el valor de la 9na posición de la línea (que según tu ejemplo corresponde a porcentaje) si es 0 no incluye la línea en el resultado solo la obvia y luego creará un archivo plano de nombre "Resultado.TXT" en la ubicación desde donde hayas ejecutado éste procedimiento.

Es solo una idea más simple tu puedes darle mejor forma y que guarde en donde prefieras.
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