Importar datos de un csv que contiene caracteres especiales
Con frecuencia nos hemos encontrado con escenarios en que un cliente quiere importar datos en NAV mediante archivos csv, y para ello utiliza un XMLPort. En principio no debería haber problema, pero a veces vemos situaciones en que algunos caracteres especiales (o locales, como nuestra “ñ”) no se importan correctamente, y en su lugar aparecen caracteres extraños. Por ejemplo, si tenemos un csv con los siguientes datos:
Y utilizamos un XMLPort para importarlos a nuestra tabla, obtenemos esto:
El problema reside en que no podemos controlar cómo el XMLPort está leyendo los datos (los caracteres), y solo podemos intentar adaptar los valores de los campos una vez ya los ha leído, en los triggers del XMLPort, o intentar cambiar los valores en Excel antes de importarlos a NAV.
La primera opción no termina de ser una solución, ya que en trigger el XMLport ya ha leído los datos internamente y entonces estos datos ya contienen caracteres erróneos.
La segunda opción podría servir en algunos casos. Por ejemplo, si abrimos el csv anterior en Excel y guardamos indicando el formato, como por ejemplo “CSV (MS-DOS)” en este caso sí aparecerán los caracteres correctamente en la tabla:
Pero si intentamos importar datos con otros caracteres, para algunos en concreto no nos aparece bien:
Hay algunas opciones para intentar corregir esto, como el convertir por código ciertos caracteres antes de tratarlos, pero aquí vamos a explicar una forma alternativa a los XMLPort para importar este tipo de archivos.
Para explicarlo usaremos un ejemplo: el csv anterior, una tabla de prueba y una CodeUnit:
Type ID Name |
1 50050 Mytable |
5 50041 EncodingCU |
Podéis descargar los objetos aquí.
En la CodeUnit podéis ver que importamos usando Streams y controlamos la codificación (encoding) para que los caracteres sean importados correctamente a nuestra tabla de NAV:
OnRun()
streamDN := streamDN.StreamReader('C:\test\test.csv', encodingDN.Default()); //Abrir el csv (cambiad la ruta) y seleccionar el encoding por defecto de nuestro SSOO
input := streamDN.ReadLine();
WHILE (input <> '') DO BEGIN //Leer linea a linea
EVALUATE(mytable.MyCode, SELECTSTR(1, input)); //Leer cada valor y guardar en el campo
mytable.MyText := SELECTSTR(2, input);
EVALUATE(mytable.MyInt, SELECTSTR(3, input));
mytable.INSERT(TRUE); //Insertar en la tabla
input := streamDN.ReadLine();
END;
Esto lo hacemos utilizando variables de tipo DotNet para el stream y encoding, por lo que esta solución es válida para ejecutar en el RTC (no en el clásico) por ejemplo desde una página. También tenemos que tener en cuenta que sólo podemos utilizar variables de tipo DotNet en NAV 2009 R2.
Si importamos los datos así entonces veremos que los caracteres aparecen correctamente en la tabla y podemos mostrarlos desde nuestros forms y páginas:
Juliet R. Moreiro Bockhop
Microsoft Dynamics NAV Support Engineer
“Los ejemplos aquí expuestos se proporcionan sólo como ejemplo ilustrativo y en ningún caso el autor se hace responsable del contenido ni efectos que pueda tener su uso.”