Descubriendo juegos de caracteres
Puede que alguna vez hayas tenido que pasar datos de un fichero en algún formato extraño a una BD u otro tipo de repositorio. En el proceso de exportación/importación de los datos puede haber problemas con los juegos de caracteres ya que en aplicaciones del mundo antiguo (vease DOS etc) en lenguajes tenebrosos (COBOL, Pascal, etc...) vete a saber los juegos de caracteres que se usaban.
A veces tendrás que sacar los datos de un fichero en formato DBF, cosa fácil usando un script propio
o uno más profesional como dbf_dump.
Una vez tienes el fichero puedes echar un ojo (a ojo) si te salen las tildes y las Ñs, o bien puedes echar mano del comando file. Puede que los caracteres salgan mal y file diga esto:
linux$ file -i fichero.csv
fichero.csv: text/plain charset=unknown
linux$
Ups! Vale, qué no punda el canico. Sabemos que disponemos del comando iconv para hacer la conversión de caracteres. El formato es así:
linux$ iconv --from=JUEGO_DE_CARACTERES_ORIGEN --to=JUEGO DE CARACTERES_DESTINO fichero.csv > resultado.csv
Pero estamos en las mismas. Sabemos lo que queremos, tenemos la herramienta, pero no conocemos el JUEGO_DE_CARACTERES_ORIGEN.
Bueno, la informática permite hacer el burro y probar los 1000y poco juegos disponibles con iconv y un simple bucle.Y uno, como es muy bruto y a veces no se tiene tiempo de investigar más y de documentarse sobre los juegos de caracteres de DOS y tal pues nada, todos al bucle y a ver cuál funciona.
Primero necesitamos la lista de juego de caracteres:
linux$ for i in `iconv -l`; do echo $i; done > juegos.txt
Con eso generamos la lista, quizá haya que editarla y reemplazar caracteres \\, vale, no me apetece buscar la orden sed, no me la "sed" de memoria (festivaaaal del humooor).
Y ahora vamos a lo bruto. En un bucle for sacamos las 10 primeras líneas del fichero misterioso y vamos probando cada uno de los juegos de caracteres, guardando el resultado en un fichero con el nombre modificado:
linux$ for i in `cat juegos.txt`
do
echo -n Convirtiendo ${i}
head fichero.csv | iconv --from=$i --to=UTF-8 > fichero.${i}.csv
echo done
done
linux$
Echamos un ojo a los resultados, con un GREP que busque una línea concreta eta kitto!!
Puede que el juego sea un 850 o similar.