el ejercicio es el siguiente:
tengo un archivo base (ARCHIVO_BASE.TXT) con 363.674 registros
(el archivo base que pondre aka tiene una cantidad mucho menor)
Código:
20100817036367300000005124506158
001058913920091015200911102010082600000500410000031891920053866123
00099778632009072120090815201008260000286741000003189193005386628K
001058915120091015200911102010082600002770410000031892080053867960
000997793920090721200908152010082600001716410000031892450053872220
001202927320100411201005052010082600014820410000031892470053872549
001307911820100811201009052010082600008610410000031892510053872786
000012517820100807201009012010082600006030390000031892540053872816
000997785420090721200908152010082600001417410000031892570053873081
001201805520100411201005052010082600005320410000001963750132585601
001226921820100507201006012010082600000182410000001966660132612358
001058913920091015200911102010082600000500410000031891920053866123
00099778632009072120090815201008260000286741000003189193005386628K
001058915120091015200911102010082600002770410000031892080053867960
000997793920090721200908152010082600001716410000031892450053872220
001202927320100411201005052010082600014820410000031892470053872549
001307911820100811201009052010082600008610410000031892510053872786
000012517820100807201009012010082600006030390000031892540053872816
000997785420090721200908152010082600001417410000031892570053873081
001201805520100411201005052010082600005320410000001963750132585601
001226921820100507201006012010082600000182410000001966660132612358
001058913920091015200911102010082600000500410000031891920053866123
00099778632009072120090815201008260000286741000003189193005386628K
001058915120091015200911102010082600002770410000031892080053867960
000997793920090721200908152010082600001716410000031892450053872220
001202927320100411201005052010082600014820410000031892470053872549
001307911820100811201009052010082600008610410000031892510053872786
000012517820100807201009012010082600006030390000031892540053872816
000997785420090721200908152010082600001417410000031892570053873081
001201805520100411201005052010082600005320410000001963750132585601
001226921820100507201006012010082600000182410000001966660132612358
001058913920091015200911102010082600000500410000031891920053866123
00099778632009072120090815201008260000286741000003189193005386628K
001058915120091015200911102010082600002770410000031892080053867960
000997793920090721200908152010082600001716410000031892450053872220
001202927320100411201005052010082600014820410000031892470053872549
001307911820100811201009052010082600008610410000031892510053872786
000012517820100807201009012010082600006030390000031892540053872816
000997785420090721200908152010082600001417410000031892570053873081
001201805520100411201005052010082600005320410000001963750132585601
001226921820100507201006012010082600000182410000001966660132612358
este archivo debe ser recorrido y guardar en otra archivo llamado "RUTS.TXT " los RUT de estos registros se encuentran en la posición 58 y tiene un largo de 9 caracteres. estos RUT se encuntran algunas veces duplicados x cantidad de veces por lo cual hay que dejar solo 1 de de cada RUT repetido.
el archivo "RUTS.TXT" quedaria asi:
Código:
053866123
05386628K
053867960
053872220
053872549
053872786
053872816
053873081
132585601
132612358
con este archivo tendremos que recorrer nuevamente el archivo "ARCHIVO_BASE.TXT" e ir haciendo una sumatorio de uno de los campos en este caso el campo monto, para si dejar solo 1 rut de los x que se repiten con la sumatoria de los montos y los demas datos que para el ejercicio no tiene importancia.
dejo a continuación el archivo "ARCHIVO_FINAL.txt" con el filtro de RUT ya hecho y con la sumatoria de los montos cuando se repite el RUT.
Código:
001058913920091015200911102010082600001000410000031891920053866123
00099778632009072120090815201008260000573441000003189193005386628K
001058915120091015200911102010082600005540410000031892080053867960
000997793920090721200908152010082600003432410000031892450053872220
001202927320100411201005052010082600029640410000031892470053872549
001307911820100811201009052010082600017220410000031892510053872786
000012517820100807201009012010082600012060390000031892540053872816
000997785420090721200908152010082600002834410000031892570053873081
001201805520100411201005052010082600010640410000001963750132585601
001226921820100507201006012010082600000364410000001966660132612358
00099778632009072120090815201008260000573441000003189193005386628K
001058915120091015200911102010082600005540410000031892080053867960
000997793920090721200908152010082600003432410000031892450053872220
001202927320100411201005052010082600029640410000031892470053872549
001307911820100811201009052010082600017220410000031892510053872786
000012517820100807201009012010082600012060390000031892540053872816
000997785420090721200908152010082600002834410000031892570053873081
001201805520100411201005052010082600010640410000001963750132585601
001226921820100507201006012010082600000364410000001966660132612358
resalto el campo con la sumatoria
Código:
0010589139200910152009111020100826 00001000 410000031891920053866123
0009977863200907212009081520100826 00005734 41000003189193005386628K
0010589151200910152009111020100826 00005540 410000031892080053867960
0009977939200907212009081520100826 00003432 410000031892450053872220
0012029273201004112010050520100826 00029640 410000031892470053872549
0013079118201008112010090520100826 00017220 410000031892510053872786
0000125178201008072010090120100826 00012060 390000031892540053872816
0009977854200907212009081520100826 00002834 410000031892570053873081
0012018055201004112010050520100826 00010640 410000001963750132585601
0012269218201005072010060120100826 00000364 410000001966660132612358
0009977863200907212009081520100826 00005734 41000003189193005386628K
0010589151200910152009111020100826 00005540 410000031892080053867960
0009977939200907212009081520100826 00003432 410000031892450053872220
0012029273201004112010050520100826 00029640 410000031892470053872549
0013079118201008112010090520100826 00017220 410000031892510053872786
0000125178201008072010090120100826 00012060 390000031892540053872816
0009977854200907212009081520100826 00002834 410000031892570053873081
0012018055201004112010050520100826 00010640 410000001963750132585601
0012269218201005072010060120100826 00000364 410000001966660132612358
el campo a sumar se encuentra en el archivo "ARCHIVO_BASE.TXT" y esta en la pocición 35 con un largo de 8 caracteres
a continuación el codigo fuente:
se necesita un boton , un modulo y un commonDialog llamado "cd"
codigo para el boton:
Código:
Private Sub Command1_Click()
Private Sub Command1_Click()
Dim ARCHIVO_RUT As String
Dim DIRECCION As String
Dim RUT1 As String
Dim SW2 As Integer
Dim rutrut As String
Dim campo1 As String
Dim campo3 As String
Dim sumatoria As String
Dim sumatoriaVal As Long
EscriveLog "", "RUTS" ' crea el archivo "RUTS" y guarda un espacio en blanco
ARCHIVO_RUT = App.Path & "\" & "RUTS.txt" ' se guarda la direccion del archivo "RUTS"
cd.ShowOpen ' abre una ventana para buscar el archivo base
DIRECCION = cd.FileName ' la direccion se guarda en una variable
Open DIRECCION For Input As #1 ' abrimos el archivo
While Not EOF(1) ' lo recorremos mientras no sea fin de archivo
Line Input #1, linea1 ' se posiciona en la primera o la siguiente linea del archivo
RUT1 = Mid$(linea1, 58, 9) ' en la posicion 58 de largo 9 se encuentra el rut y lo guardamos
If RUT1 <> "" Then ' si el rut es distindo de vacio haga
Open ARCHIVO_RUT For Input As #2 ' abrir el archivo donde se guardan los rut
While SW2 = 0 And Not EOF(2) ' hacemos mienrras el sw2 sea igual a 0
Line Input #2, linea2 ' se posiciona en la primera o siguiente linea
rutrut = Mid$(linea2, 1, 9) ' se guarda lo que se encuntre en la posicion 1 de lsrgo 9
If RUT1 = rutrut Then ' si el rut del archivo base = a los que se tomo del archivo_rut
SW2 = 1 ' el sw2 toma el valor 1
End If
Wend
Close #2
If SW2 = 0 And RUT1 <> "" Then si el sw2 es cero es pq el rut no esta repetido en el archivo RUTS
EscriveLog RUT1, "RUTS" ' se guarda el rut nuevo en el archivo RUTS
End If
SW2 = 0 ' se deja nuevamente el valor del sw2 en cero
End If
Wend ' se va al siguiente registro si no es fin de archivo
Close #1 ' cerramos el archivo
sumatoria = 0
Open ARCHIVO_RUT For Input As #1 ' abrimos el archivo que contiene los rut una sala vez
While Not EOF(1) ' hacemos mientras no sea find e archivo
Line Input #1, linea1 ' nos posicionamos en la primera o la siguiente linea
RUT1 = Mid$(linea1, 1, 9) ' se almacena el valor de el rut
If RUT1 <> "" Then ' si el rut es distinto de blanco
Open DIRECCION For Input As #2 ' abrimos el archivo base
While Not EOF(2) ' hacemos mientras no sea finde archivo
Line Input #2, linea2 ' no sposicionamos en el primero o siguiente registro
rut2 = Mid$(linea2, 58, 9) ' guardamos el rut del registro del archivo base
If RUT1 = rut2 Then ' comparamos el rut del archivo base con el el contenedor de rut
campo1 = Mid$(linea2, 1, 34) 'dato que no importa
campo3 = Mid$(linea2, 43, 24) ' dato que no importa
sumatoria = Mid$(linea2, 35, 8) ' guardamos el monto (string) del archivo base
sumatoriaVal = Val(sumatoria) ' pasamos de string a numerico
sumatoria = sumatoria + sumatoriaVal ' sumamos lo que tiene sumatoria con el numerico
sumatoria = Str(sumatoria) ' pasamos la sumatoria a string
sumatoriaVal = Len(sumatoria) ' obtenemos el largo del string de sumatoria
sumatoriaVal = sumatoriaVal - 1 ' al largo del string le restamos 1
sumatoria = Right$(sumatoria, sumatoriaVal) ' cortamos el string pq al pasarlo de numerico
' a string se crea un espacio en blanco
sumatoriaVal = 8 - sumatoriaVal 'rellena con ceros a la izquierda
While sumatoriaVal > 0 'para tener un string de largo 8
sumatoria = "0" + sumatoria '
sumatoriaVal = sumatoriaVal - 1 '
Wend
End If
Wend
sumatoria = campo1 + sumatoria + campo3 '
EscriveLog sumatoria, "ARCHIVO_FINAL" 'guardamos el registro en el archivo final
sumatoria = 0
Close #2
End If
Wend
Close #1
MsgBox "FIN"
End Sub
Private Sub Command1_Click()
Dim ARCHIVO_RUT As String
Dim DIRECCION As String
Dim RUT1 As String
Dim SW2 As Integer
Dim rutrut As String
Dim campo1 As String
Dim campo3 As String
Dim sumatoria As String
Dim sumatoriaVal As Long
EscriveLog "", "RUTS" ' crea el archivo "RUTS" y guarda un espacio en blanco
ARCHIVO_RUT = App.Path & "\" & "RUTS.txt" ' se guarda la direccion del archivo "RUTS"
cd.ShowOpen ' abre una ventana para buscar el archivo base
DIRECCION = cd.FileName ' la direccion se guarda en una variable
Open DIRECCION For Input As #1 ' abrimos el archivo
While Not EOF(1) ' lo recorremos mientras no sea fin de archivo
Line Input #1, linea1 ' se posiciona en la primera o la siguiente linea del archivo
RUT1 = Mid$(linea1, 58, 9) ' en la posicion 58 de largo 9 se encuentra el rut y lo guardamos
If RUT1 <> "" Then ' si el rut es distindo de vacio haga
Open ARCHIVO_RUT For Input As #2 ' abrir el archivo donde se guardan los rut
While SW2 = 0 And Not EOF(2) ' hacemos mienrras el sw2 sea igual a 0
Line Input #2, linea2 ' se posiciona en la primera o siguiente linea
rutrut = Mid$(linea2, 1, 9) ' se guarda lo que se encuntre en la posicion 1 de lsrgo 9
If RUT1 = rutrut Then ' si el rut del archivo base = a los que se tomo del archivo_rut
SW2 = 1 ' el sw2 toma el valor 1
End If
Wend
Close #2
If SW2 = 0 And RUT1 <> "" Then si el sw2 es cero es pq el rut no esta repetido en el archivo RUTS
EscriveLog RUT1, "RUTS" ' se guarda el rut nuevo en el archivo RUTS
End If
SW2 = 0 ' se deja nuevamente el valor del sw2 en cero
End If
Wend ' se va al siguiente registro si no es fin de archivo
Close #1 ' cerramos el archivo
sumatoria = 0
Open ARCHIVO_RUT For Input As #1 ' abrimos el archivo que contiene los rut una sala vez
While Not EOF(1) ' hacemos mientras no sea find e archivo
Line Input #1, linea1 ' nos posicionamos en la primera o la siguiente linea
RUT1 = Mid$(linea1, 1, 9) ' se almacena el valor de el rut
If RUT1 <> "" Then ' si el rut es distinto de blanco
Open DIRECCION For Input As #2 ' abrimos el archivo base
While Not EOF(2) ' hacemos mientras no sea finde archivo
Line Input #2, linea2 ' no sposicionamos en el primero o siguiente registro
rut2 = Mid$(linea2, 58, 9) ' guardamos el rut del registro del archivo base
If RUT1 = rut2 Then ' comparamos el rut del archivo base con el el contenedor de rut
campo1 = Mid$(linea2, 1, 34) 'dato que no importa
campo3 = Mid$(linea2, 43, 24) ' dato que no importa
sumatoria = Mid$(linea2, 35, 8) ' guardamos el monto (string) del archivo base
sumatoriaVal = Val(sumatoria) ' pasamos de string a numerico
sumatoria = sumatoria + sumatoriaVal ' sumamos lo que tiene sumatoria con el numerico
sumatoria = Str(sumatoria) ' pasamos la sumatoria a string
sumatoriaVal = Len(sumatoria) ' obtenemos el largo del string de sumatoria
sumatoriaVal = sumatoriaVal - 1 ' al largo del string le restamos 1
sumatoria = Right$(sumatoria, sumatoriaVal) ' cortamos el string pq al pasarlo de numerico
' a string se crea un espacio en blanco
sumatoriaVal = 8 - sumatoriaVal 'rellena con ceros a la izquierda
While sumatoriaVal > 0 'para tener un string de largo 8
sumatoria = "0" + sumatoria '
sumatoriaVal = sumatoriaVal - 1 '
Wend
End If
Wend
sumatoria = campo1 + sumatoria + campo3 '
EscriveLog sumatoria, "ARCHIVO_FINAL" 'guardamos el registro en el archivo final
sumatoria = 0
Close #2
End If
Wend
Close #1
MsgBox "FIN"
End Sub
codigo para el modulo:
Código:
Public Function EscriveLog(ByRef Texto As String, ByRef tipo As String) ', ByRef xTipo As Byte)
Dim strFile As String
Dim fn As Long
Dim strLog As String
strFile = App.Path & "\" & tipo & ".txt"
fn = FreeFile
strLog = Texto
Open strFile For Append As fn
Print #fn, strLog
Close fn
End Function
Dim strFile As String
Dim fn As Long
Dim strLog As String
strFile = App.Path & "\" & tipo & ".txt"
fn = FreeFile
strLog = Texto
Open strFile For Append As fn
Print #fn, strLog
Close fn
End Function
duración de lectura
104.000 registros en 90 minutos de un total de 363.674
espero me puedan ayudar, antes ya lo han hecho... de antemano MUCHISIMAS GRACIAS!!!