Pregunta ¿Cómo generar resultados de consulta MySQL en formato CSV?


¿Hay alguna manera fácil de ejecutar una consulta MySQL desde la línea de comandos de Linux y mostrar los resultados en CSV  ¿formato?

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 vuelve complicado cuando hay muchas columnas que deben estar rodeadas de comillas, o si hay citas en los resultados que deben escaparse.


932
2017-12-10 15:59


origen


Respuestas:


De 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';

Al usar este comando, los nombres de las columnas no se exportarán.

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

Si desea escribir salida en su 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.


1425
2017-12-10 16:07



$ mysql your_database --password=foo < my_requests.sql > out.csv

Cuál es tabulado separado Píllalo así para obtener un verdadero CSV (gracias @therefromhere):

... .sql | sed 's/\t/,/g' > out.csv

359
2018-04-08 16:53



mysql --batch, -B

Imprima los resultados usando la pestaña como el separador de columna, con cada fila en una   nueva línea. Con esta opción, mysql no usa el archivo de historial.   El modo por lotes da como resultado un formato de salida no tabular y un escape de   caracteres especiales. Escapando puede ser deshabilitado usando el modo raw; ver   la descripción de la opción --raw.

Esto le dará un archivo separado por tabuladores. Como las comas (o cadenas que contienen coma) no se escapan, no es fácil cambiar el delimitador a coma.


170
2017-09-30 10:51



Aquí hay una manera bastante grosera de hacerlo. Lo encontré en alguna parte, no puedo tomar ningún crédito

mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv

Funciona bastante bien Una vez más, aunque una expresión regular prueba solo escritura.


Explicación Regex:

  • s /// significa sustituir lo que está entre el primero // con lo que está entre el segundo //
  • la "g" al final es un modificador que significa "todas las instancias, no solo las primeras"
  • ^ (en este contexto) significa comienzo de línea
  • $ (en este contexto) significa fin de línea

Entonces, poniéndolo todo junto:

s/'/\'/          replace ' with \'
s/\t/\",\"/g     replace all \t (tab) with ","
s/^/\"/          at the beginning of the line place a "
s/$/\"/          at the end of the line place a "
s/\n//g          replace all \n (newline) with nothing

112
2018-03-22 17:31



Unix /Cygwin solo, páselo por 'tr':

mysql <database> -e "<query here>" | tr '\t' ',' > data.csv

N.B .: Esto no maneja comas incrustadas, ni pestañas incrustadas.


68
2017-10-11 15:19



La solución OUTFILE dada por Paul Tomblin hace que un archivo se escriba en el servidor MySQL mismo, así que esto solo funcionará si tiene ARCHIVO acceso, así como el acceso de inicio de sesión u otros medios para recuperar el archivo de ese cuadro.

Si no tiene dicho acceso, y la salida delimitada por tabuladores es un sustituto razonable de CSV (por ejemplo, si su objetivo final es importar a Excel), entonces la solución de Serbaut (utilizando mysql --batch y opcionalmente --raw) es el camino a seguir.


33
2018-06-22 13:48



Qué tal si:

mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv

30
2017-11-10 18:41