FoxPro/Visual FoxPro - problema para levantar txt en dbf

   
Vista:

problema para levantar txt en dbf

Publicado por Gloria galemanaard@hotmail.com (3 intervenciones) el 09/05/2014 16:51:51
HOla, quiero levantar un txt en dbf que tiene mas de 2.000.000 de registros, el txt tiene la particularidad que una cierta cantidad de registros empiezan con 2421, otros con 2422 y otros con 2423. Entonces yo pensé en crear una tabla por cada uno, por ejemplo cod2421, cod2422 y cod2423, recorrer el txt y appendear en cod2421 mientras las 4 primeras posiciones de la cadena =2421. El tema es que no se bien como hacerlo, porque es como que ni siquiera me abre el txt al ser tan grande. Les muestro lo que hice

arch=fopen('NLAVDIN2.TXT')
if arch<0
messagebox('Imposible Abrir el Archivo '+chr(13)+;
'Deberá volver a importarlo',16,'Mensajes de Validación')
sali=.t.
fclose(arch)
return
else
do while not feof(arch)
cadena=fgets(arch,256)

IF SUBSTR(CADENA,1,4)='2421'
SELE COD2421
APPEND FROM CADENA SDF
ENDIF
LOOP
ENDDO
=FCLOSE(ARCH)
ENDIF
Es como que nunca entra al do while, me da como feof el archivo
Desde ya agradezco la repuesta de alguno, porque me urge el trabajo
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

problema para levantar txt en dbf

Publicado por Fidel José (558 intervenciones) el 09/05/2014 17:36:56
La limitación tanto para funciones de bajo nivel como para tablas, es de 2 gigabytes, independientemente del número de registros.
Por otra parte, puede ocurrir que el archivo no tenga Chr(13)+chr(10) en cada linea (en SDF no es obligatorio) de donde pueden surgir problemas con fGets(). Fgets no toma más que 8192 caracteres.

La pregunta es qué tamaño tiene el archivo txt. Si tiene 2 o más gigabytes, no podrás agregar todos esos registros en una dbf, saldo que la tabla tenga solo algunos campos y así se limite su contenido.
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

problema para levantar txt en dbf

Publicado por Gloria (3 intervenciones) el 09/05/2014 18:40:07
lo de chr() olvidate, eso es para mostrar el mje si no se puede abrir el archivo,

El archivo tiene mas de 2 gb, el tema es por eso, yo quiero levantar el txt en 3 dbfs, porque en uno solo no me lo levanta, pasé una parte del prg, como para que vean el ejemplo. Pero el tema es que no me llega ni a leer el txt, es como q me muestra que es fin de archivo, porque no entra ni por el do while().
Lo que quiero hacer es que todos los registro del txt que comienzan con 2421, los levante en cod2421, los que empiezan con 2422 los levante en cod2422 y los que empiezan con 2423 en cod2423.
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

problema para levantar txt en dbf

Publicado por Fidel José (558 intervenciones) el 09/05/2014 22:49:30
Gloria:
En este ejemplo, en lugar de utilizar fopen() y fgets, utilizo Scripting.FilesystemObject.
Fijate en el archivo adjunto para ver que trato de descubrir la cadena "<reg>Record 001" en cada línea (por eso se usa "<reg>" para el LOOP) y detectar los cambios en los primeros dos dígitos después de Record.
En el ejemplo se generan 53 archivos txt seriados.

El procedimiento utiliza el Array gaFiles() para retener el nombre completo de los archivos generados. Va que puedes enviar esto a un control List o a un cursor, como te guste y ver los archivos con un editor de texto:
*!* STORE null TO ots,fso
*!* o = CREATEOBJECT("Shell.Application")
*!* o.ShellExecute("notepad.exe", '&LcNewFile', "", "open", 1)
* Puedes poner otro editor (por ejemplo Write.exe) si notepad.exe resulta insuficiente.

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
LOCAL lcFile,lnHand,lcNewFile,ots,fso,lcChar,lnFiles,;
	lcTest
STORE 0 TO lnFiles
LOCAL ARRAY gaFiles(1)
lcChar="00"
 
lcFile=GETFILE("txt")
IF EMPTY(lcFile)
	RETURN
ENDIF
 
gaFiles[1]=ADDBS(JUSTPATH(lcFile))+JUSTSTEM(lcFile)+lcChar+".txt"
lnhand=FCREATE(gaFiles[1])
 
FSO = CreateObject("Scripting.FileSystemObject")
oTS = FSO.OpenTextFile('&lcFile')
DO WHILE NOT oTS.AtEndOfStream
    lcGet = oTS.ReadLine()
    lcTest=ALLTRIM(CHRTRAN(lcGet,CHR(9),""))
    IF AT("<reg>",lcTest)=0
    	LOOP
    ENDIF
 
 
	IF SUBSTR(lcTest,13,2) # lcChar
		=FCLOSE(lnHand)
		lcChar=SUBSTR(lcTest,13,2)
		lnFiles = lnFiles + 1
		DIMENSION gaFiles(lnFiles)
		gaFiles[lnFiles]=ADDBS(JUSTPATH(lcFile))+JUSTSTEM(lcFile)+lcChar+".txt"
		lnhand=FCREATE(gaFiles[lnfiles])
	ENDIF
    =FPUTS(lnHand,lcGet)
ENDDO
oTS.Close()
IF lnHand > -1
	=FCLOSE(lnHand)
ENDIF
 
*!*	STORE null TO ots,fso
*!*	o = CREATEOBJECT("Shell.Application")
*!*	o.ShellExecute("notepad.exe", '&LcNewFile', "", "open", 1)
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

problema para levantar txt en dbf

Publicado por Gloria (3 intervenciones) el 10/05/2014 01:28:53
Uy! Muchisimas gracias! El lunes lo pruebo en el trabajo y te cuento como me fue!
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

problema para levantar txt en dbf

Publicado por neo (1601 intervenciones) el 12/05/2014 04:08:15
Pienso que con un motor de base de datos (MySQL) , te vendría bastante bien.

Saludos.
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

problema para levantar txt en dbf

Publicado por Valdemar (1 intervención) el 16/07/2014 17:16:47
Hola Gloria, si es que aún no has logrado la solución a tu consulta, espero te sirva de ayuda el código siguiente.

Según el código que has desarrollado en la parte de APPEND, esa forma funciona para cargar todo el archivo texto en la tabla, si la idea es hacerlo línea por línea según la condición descrita ej. SUBSTR(CADENA,1,4)='2421, se tiene que utilizar APPEND BLANK, luego reemplazar el campo de la tabla con la variable cadena.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
arch = FOPEN('NLAVDIN2.TXT')
IF arch<0
   messagebox('Imposible Abrir el Archivo '+chr(13)+;
   'Deberá volver a importarlo',16,'Mensajes de Validación')
   sali=.t.
   FCLOSE(arch)
   RETURN
ELSE
     DO  WHILE NOT FEOF(arch)
         cadena=FGETS(arch, 256)
         IF SUBSTR(CADENA,1,4)='2421' .OR. SUBSTR(CADENA,1,4)='2422' .OR. SUBSTR(CADENA,1,4)='2423'
            SELE TABLA
            APPEND BLANK
            REPLACE Campo WITH cadena
         ENDIF
      ENDDO
      =FCLOSE(ARCH)
ENDIF

Saludos y mucha suerte
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