Los archivos de valores separados por comas (CSV) son una forma de transferir datos entre aplicaciones. Las bases de datos como MySQL y el software de hojas de cálculo como Excel admiten la importación y exportación a través de CSV, por lo que puede usar Archivos CSV para intercambiar datos entre los dos.
Los archivos CSV son texto sin formato, por lo que son naturalmente livianos y fáciles de exportar desde MySQL.
Desde el servidor de la base de datos
Si tiene acceso al servidor en el que se ejecuta MySQL, puede exportar una selección con el INTO OUTFILE
mando.
SELECT id, column1, column2 FROM table INTO OUTFILE '/tmp/mysqlfiles/table.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n'
Esto generará un archivo CSV a /tmp/mysqlfiles/table.csv
, o donde lo haya configurado. Deberá asegurarse de que el usuario que ejecuta MySQL (de forma general mysql
o root
) tiene propiedad y acceso de escritura al directorio.
Además deberá asegurarse de secure_file_priv
La configuración posibilita que MySQL acceda a ese directorio. Esto, de forma predeterminada, bloquea el acceso de lectura y escritura de las consultas SQL. Ésto es una cosa buena; si su código es vulnerable a la inyección de SQL, cualquier atacante potencial solo tendría acceso a MySQL y no al resto del sistema de archivos.
Puede incluir directorios específicos en el listado blanca editando su archivo de configuración de MySQL (de forma general ubicado en /etc/my.cnf
) para incluir:
[mysqld] secure-file-priv = "/tmp/mysqlfiles"
Lo que permitirá a MySQL leer y escribir en /tmp/mysqlfiles/
(que deberás de crear con mkdir
). Una vez que MySQL pueda exportar archivos, debería poder ejecutar la consulta y generar archivos CSV.
Con el ENCLOSED BY
configuración, las comas se escaparán correctamente, a modo de ejemplo:
"3","Escape, this","also, this"
Que puede tomar e importar de forma directa a cualquier programa de hoja de cálculo u otro software.
Tenga en cuenta que el archivo CSV exportado no incluye encabezados de columna, pero las columnas estarán en el mismo orden que el SELECT
declaración. Al mismo tiempo, los valores nulos se exportarán como N
, que es el comportamiento esperado, pero si desea cambiar esto, puede modificar la selección envolviendo ifnull(field, "")
alrededor de sus campos en su SELECT
declaración.
Desde la línea de comandos de MySQL
Si solo tiene acceso de línea de comandos a la instancia de MySQL, y no tiene acceso al servidor en sí (como cuando usted no lo administra, en el caso de Amazon RDS), el problema es un poco más complejo. Mientras puedes utilizar FIELDS TERMINATED BY ','
en el servidor para generar una lista separada por comas, la CLI de MySQL se separará con pestañas de forma predeterminada.
Simplemente ingrese una consulta desde la línea de comando y canalícela a un archivo:
mysql -u root -e "select * from database;" > output.tsv
Debido a que la salida de MySQL está separada por pestañas, esto se denomina archivo TSV, para «valores separados por pestañas», y puede funcionar en lugar de su archivo CSV en algunos programas, como las importaciones de hojas de cálculo. Pero no es un archivo CSV y convertirlo en uno es complicado.
Simplemente podría reemplazar cada pestaña con una coma, lo que funcionaría pero haría que fallara si hay comas en los datos de entrada. Si está absolutamente seguro de que no hay comas en su archivo TSV (consulte con grep
), puede reemplazar las pestañas con sed
:
sed "s/t/,/g" output.tsv > output.csv
Pero si tiene comas en sus datos, tendrá que utilizar un mucho mas largo expresión regular:
sed "s/'/'/;s/t/","/g;s/^/"/;s/$/"/;s/n//g" output.tsv > output.csv
Esto escapará correctamente de los campos entre comillas, lo que resolverá el problema de las comas.
Nota: el carácter de tabulación t
es no estándar. En macOS y BSD, no está habilitada, lo que genera un desorden de cada «t» minúscula que causa sed
para insertar comas erróneas. Para solucionar esto, deberá utilizar un carácter de tabulación literal en lugar de t
:
sed "s/ /,/g" output.tsv > output.csv
Si sus datos de entrada contienen pestañas, no tiene suerte y tendrá que generar un archivo CSV usted mismo con un lenguaje de secuencias de comandos.
Hágalo manualmente con un lenguaje de programación real
MySQL (y la mayoría de las bases de datos) están diseñadas para interactuar con él, por lo que es probable que ya tenga algún tipo de lenguaje de programación conectado a MySQL. La mayoría de los idiomas además pueden escribir en el disco, por lo que puede crear sus propios scripts de salida CSV leyendo los campos de la base de datos de forma directa, escapándolos correctamente y escribiendo un archivo delimitado por comas.