Juegos de caracteres en importación de Foxpro


([N4] gontorre) #1

Buenos días

Necesito importar de una tabla de Visual Foxpro una serie de campos de tipo Memo (longitud variable). Lo estoy haciendo mediante ODBC y tengo un problema con la importación de los acentos. El proceso lo adjunto en una imagen.

La cadena de conexión ODBC es:

“Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=c:\temp\traspasovfp;Exclusive=No;Collate=Machine;NULL=NO;DELETED=YES;BACKGROUNDFETCH=NO;”

El problema es que me sustituye los acentos por un símbolo extraño.

He probado con varias conversiones de juegos de caracteres pero sin éxito.

¿Alguna ayuda?

Gracias y un saludo


([N4] gontorre) #2

Y el adjunto que nunca sube a la primera…



([N3] pacosatu) #3

Hola Gonzalo.

Olvídate del ODBC de VFP cuando vayas a importar texto con caracteres no-ASCII estandar.
Las tablas DBF estarán codificadas normalmente en ANSI/Windows-1252 (compruébalo con CPDBF()).

El problema es que el driver ODBC entrega los datos a Velneo en una codificación desconocida. En Soporte no me han dado solución y ante la falta absoluta de documentación al respecto, lo más práctico es recurrir al método clásico de exportar los DBF a texto plano y prescindir del ODBC.

Otras soluciones:

  • Si es posible, añadir un campo Memo a las tablas dbf con el texto codificado en Base64 usando STRCONV(memo,13). Sigues usando el ODBC y solo tienes que decodificar el texto en Velneo usando VByteArray.
  • Usar el Driver nativo SQLite para Velneo. Exportas las tablas DBF a texto plano, conviertes a UTF-8 mediante Notepad++, importas a SQlite, usas el driver SQLite de Velneo y todo va perfecto.

Saludos
Paco Satué


([N4] gontorre) #4

Hola Paco

Todas las importaciones las tengo hechas con ficheros CSV, pero me encontraba el problema de exportar los campos Memo. Esos no los puedo meter en un CSV. La única solución que se me ocurre es crear un fichero de texto plano para cada campo memo de cada registro que tenga información y cargarlos de uno en uno.

Una paliza, vamos.

Gracias y un saludo


([N3] pacosatu) #5

Hola Gonzalo.

Te adjunto un PRG que genera un fichero plano desde cualquier tabla DBF. Exporta los campos memo y usa el separador | entre campos. Puedes adaptarlo a tus necesidades.

Saludos
Paco Satué

dbf_a_texto.zip (1.07 KB)


([N1] Anacreonte) #6

Hola a todos.

Yo tal y como comenté aquí http://velneo.es/foros/topic/exportacion-a-fichero-dbf/ tengo justo el problema contrario. Tengo que exportar una serie de datos desde Velneo hacía un dbf y con los acentos y la letra ñ me dan problemas a la hora de instertar los datos en el dbf. Aún no he probado lo que Paco me indicó por falta de tiempo.

Lo que si que me he dado cuenta es que a la hora de crear el fichero de texto, aunque le indiques la codificación y luego se edite con Notepad++ este siempre indica que la condificación es ANSI.


([N4] gontorre) #7

Muchas gracias Paco. Me ahorras mucho trabajo.

Estas cervezas que te debo las voy apuntando :slight_smile:


([N3] pacosatu) #8

Hola Anacreonte.

Exportando a DBF con ODBC vas a tener el mismo problema con los acentos y ñ. He podido comprobar que la codificación del texto exportado a la tabla DBF es CP850/IBM850 en lugar de ANSI/Windows-1252 que sería lo lógico. En Visual foxpro existe gestión de páginas de códigos de tal forma que se puede leer una tabla DBF especificando una página de códigos determinada. A tu aplicación que gestiona los DBF’s le debes indicar que la página de códigos es CP850. Otra opción es que, cuando leas el DBF, hagas tú la conversion manualmente de los códigos de los caracteres áéíóúÁÉÍÓÚñÑ de CP850 a ANSI/1252 (consulta las tablas de códigos).
En fin, un lío que complica una tarea que debería ser inmediata.

En cuanto a la creación de textos en una página de códigos determinada, ésto funciona perfectamente. Otro tema es que Notepad++ detecte la página de códigos en que está el texto. Verás que detecta siempre ANSI o UTF-8 sin BOM. Para otros casos, por ejemplo CP850, debes indicarle a Notepad++ manualmente el juego de caracteres: opción de menú Codificación->Juego de caracteres->Europa occidental->OEM 850.

Saludos
Paco Satué


([N1] Anacreonte) #9

Hola Paco,

En este caso lo que hago es que nuestra aplicación de Velneo genera un txt con los datos a importar en el fichero dbf que está creado y facilitado por la administración pública (no está gestionada por una aplicación nuestra de ahí la problemática surgida) y desde Velneo ejecuto una pequeña aplicación realizada en Python que se encarga de realizar los “insert into” en dicho dbf. Somos nosotros los que le indicamos en Velneo que codificación tiene que tener el txt generado.

Respecto a la detección por parte de Notepad++ de la codificación del txt generado, pensaba que estaba fallando por parte de Velneo la creación de los txt en los diferentes tipos de codificación.

Gracias mil Paco.


([N3] pacosatu) #10

Hola Anacreonte.

Prueba con las páginas de código siguientes: cp437, cp850 y Windows-1252. Una de las 2 últimas son las que probablemente deberían de funcionar. Si no es así, puede que python tenga el mismo problema que velneo cuando hace el Insert Into en la tabla DBF.

Adjunta un DBF de ejemplo de los que te envía la Admon. pública y otro tal como lo generas tú. Intento ver en qué página de códigos está.

Saludos
Paco Satué


([N4] victorgt) #11

Hola, yo tengo el mismo problema, al exportar a DBF, con ODBC desde Velneo (yo lo hago todos desde velneo, incluso los “insert into”). Las tildes y las ñ a la porra.

En su dia le dedique algo de tiempo y no consegui nada…

Estaria bien “desfacer” este entuerto…

Saludos.