Visto 1.885 veces.

Al guardar en la base de datos mysql los datos importados desde un archivo .csv o .txt con el metodo fgetcsv de php, la primera letra con acento de cada campo desaparece

When saving in the mysql database imported data from a file. Csv or. Txt with php fgetcsv method, the first letter of each field accent disappears.

Hace poco tuve que realizar un script para subir archivos .csv y .txt separados por comas con flash y php.

La primera opción por la que opte fue usar el método LOAD DATA LOCAL INFILE de php que para mi sorpresa no me funcionaba. Al cabo de varias horas buscando el motivo y realizando pruebas descubrí que el problema provenía del hosting que tenían capado el método por seguridad. Dada las pocas ganas que tenía para pelearme con el proveedor de alojamiento opte por utilizar el método fgetcsv.

En realidad hubiera preferido usar LOAD DATA LOCAL INFILE porque inserta los datos a lo bruto en la BDD es decir más rápido y de un golpe, en cambio fgetcsv necesita un poco mas de codificación y realizar los INSERTS uno por uno, pero tiene una ventaja y es que permite un mayor control de los datos antes de insertarlos a la BDD, con LOAD DATA LOCAL INFILE el método seguro sería crear un tabla temporal donde insertar los datos para después filtrarlos y traspasarlos a la tabla original.

Finalmente después de algunas horas de codificación ya tenía el sistema de importación terminado y funcionando a las mil maravillas, pasada la fase de testeo estábamos a punto de subirlo para actualizar nuestra RIA cuando uno de mis compañeros detecto un error, en uno de los campos desaparecía la primera letra acentuada en el momento de guardarse en la base de datos (Error critico).

ME puse a investigar un poco puesto que me parecía muy raro que no hubieran problemas de acentos en el resto de campos y en cambio en ese campo en concreto diera problemas, después de varias pruebas y descartes acabe descubriendo que no era solo ese campo si no en todos.

Por alguna razón cualquier campo que llegaba con la primera letra acentuada, esta desaparecía y no se insertaba en la BDD, este es el típico error por el que te puedes llegar a pasar unas cuantas horas buscando la solución o acabando por tirar el código y optar por otra alternativa, menos mal que hoy en día podemos echar mano de nuestro amigo internet.

Definitivamente me puse a navegar por foros en ingles en busca de una solución y tras varias horas y otras tantas pruebas al final tope con una solución simple y corta, algo tan sencillo como colocar al principio el método setlocale(LC_ALL, ‘es_ES .UTF-8 ‘); una solución que encontré prácticamente al inicio de la búsqueda pero que en un primer momento no me funciono, por lo que me vi obligado a seguir buscando y probando otras soluciones sin éxito hasta el punto de querer tirar la toalla, finalmente y con un poco de suerte acabe viendo un comentario de un usuario que decía lo siguiente.

“To work you must use setlocale (LC_ALL, ‘es_ES. UTF-8’) or setlocale (LC_ALL, ‘es_ES’); depending on the system.”

Así que pensé pues ¿y porque no? vamos a probarlo, quite el texto “UTF-8” y deje el método tal que así setlocale (LC_ALL, ‘es_ES’); cruce los dedos y realice una prueba y Eureka! Problema solucionado 🙂 (Descorche de botella y celebración por la victoria). Si hubiera encontrado ese comentario desde el principio me hubiera ahorrado 4 horas de sufrimiento.

Aquí dejo un código de ejemplo simple, y abajo la descarga del codigo simple y mi script final que con algunos cambios puede ser adaptado para otras necesidades.
Espero que esta solución sirva para quienes se encuentren con este mismo problema.

Ejemplo para importar archivos cs o txt separados por coma con php

Descargar ejemplo simple y script final personal - - Descargado (511) veces.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">