¿Cómo se puede dar salida a los resultados de las consultas de MySQL en formato CSV?

¿Existe una forma sencilla de ejecutar una consulta MySQL desde la línea de comandos de Linux y obtener los resultados en formato CSV ?

Esto es lo que estoy haciendo ahora:

mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/        /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ

Se hace un lío cuando hay muchas columnas que necesitan ser rodeadas por comillas, o si hay comillas en los resultados que necesitan ser escapadas.

Solución

Desde http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Usando este comando los nombres de las columnas no serán exportados.

También tenga en cuenta que /var/lib/mysql-files/orders.csv estará en el servidor que está ejecutando MySQL. El usuario con el que se ejecuta el proceso de MySQL debe tener permisos para escribir en el directorio elegido, o el comando fallará.

Si quieres escribir la salida en tu máquina local desde un servidor remoto (especialmente una máquina alojada o virtualizada como Heroku o Amazon RDS), esta solución no es adecuada.

Comentarios (31)

mysql --batch, -B

Imprime los resultados utilizando el tabulador como separador de columnas, con cada fila en una nueva línea. Con esta opción, mysql no utiliza el archivo histórico. El modo por lotes da como resultado un formato de salida no tabulado y el escape de caracteres especiales. El escape puede ser desactivado usando el modo raw; ver la descripción de la opción --raw.

Esto le dará un archivo separado por tabulaciones. Dado que las comas (o las cadenas que contienen comas) no se escapan, no es sencillo cambiar el delimitador a coma.

Comentarios (9)

Como alternativa a la respuesta anterior, puede tener una tabla MySQL que utilice el motor CSV.

Entonces tendrás un archivo en tu disco duro que siempre estará en formato CSV que podrías simplemente copiar sin procesarlo.

Comentarios (2)