2009-04-01 60 views
23

Estoy intentando generar resultados de consulta en formato delimitado por comas usando la herramienta de línea de comandos mysql. Mi usuario de MySQL no tiene acceso al uso de la opción "INTO OUTFILE" se hace referencia en esta pregunta:¿Cómo se obtienen los resultados de la consulta de MySQL en formato csv (en la pantalla, no en un archivo)?

How to output MySQL query results in CSV format?

También soy consciente de las opciones -H y -X al formato de salida en HTML y XML, respectivamente , pero ¿no hay forma de enviar formato csv directamente a la pantalla?

Encontré este método usando sed - http://tlug.dnho.net/?q=node/209. Pero, tengo curiosidad por encontrar una solución mysql directa.

¿Alguna idea?

Respuesta

15

Acabé teniendo la pestaña delimitado salida y copiar pegar a una hoja de cálculo y luego exportar que a CSV. También me di cuenta de que podría haber usado la función concat o concat_ws para hacer el trabajo y lo haré la próxima vez.

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws

SELECT CONCAT_WS ('', campo1, campo2, field3) de la tabla;

+3

Es posible que desee utilizar la opción '--silent' para eliminar la salida tabular. Ver http://dev.mysql.com/doc/refman/5.5/en/mysql-command-options.html#option_mysql_silent – Nobu

3

He estado usando MySQL durante años, y no conozco ninguna forma de usar el cliente de línea de comandos mysql solo para producir salida CSV, excepto por las soluciones que ya ha encontrado.

Hay un par de peticiones de características en los archivos de soporte de salida CSV:

La única otra solución que sugeriría es escribir un script en Perl o PHP, para obtener datos de MySQL y enviarlos en formato CSV o cualquier otro formato que desee. Este no es un script difícil de escribir.

+0

Es bueno saber que no estoy perdiendo algo obvio. ¡Gracias! – RyanW

1

Si usted tiene acceso a mysqldump se puede usar algo como esto

mysqldump -u [username] -p -t -T/path/to/directory [database] --fields-enclosed-by=\; --fields-terminated-by=, 
+0

Gracias por la idea. Creo que eso habría funcionado alrededor de mi problema de permisos. Pero tendría que filtrar aún más los registros y los campos porque arrojaría una tabla completa y solo intentaba obtener un pequeño subconjunto de la tabla. – RyanW

+0

Las versiones recientes de mysqldump toman un parámetro -w para proporcionar una cláusula WHERE a la tabla de dumping. – staticsan

+0

Gracias, entonces esa sería una gran alternativa. – RyanW

1

La CLI puede salir en formato delimitado por tabuladores, que es casi lo suficientemente bueno (hablo por experiencia). Use la opción -B. El mayor problema con delimitado por tabuladores es que no pude hacer que Excel importara ese formato. Sin embargo, OpenOffice sí.

+0

Exactamente, utilicé la opción -B y tomé la salida y la pegué en Numbers, que parecen acéptalo bien – RyanW

+1

Gracias, esto funcionó muy bien. Luego puede usar sed para convertirlo en CSV. Asegúrese de escribir Ctrl-V antes de la pestaña en la declaración de Sed. mysql -B -uroot foo -e 'SELECCIONE el correo electrónico, país FROM email_signups' | sed-e 's/ /,/g'> foo.csv –

2

Si tiene MySQL Workbench instalado, puede ejecutar una consulta y luego hacer clic en "exportar" sobre los resultados. Le dará la opción de guardar como .CSV.

0

Si está utilizando MySQL de forma interactiva, puede configurar su buscapersonas usar sed como esto:

$ mysql -u <user> p<passwpd> 
mysql> pager sed 's/,/\n/g' 
PAGER set to 'sed 's/,/\n/g'' 
mysql> SELECT blah FROM blah WHERE blah = blah 

. 
. 
. 
"blah":"blah" 
"blah":"blah" 
"blah":"blah" 

Si usted no usa ven como el busca la salida es la siguiente:

"blah":"blah","blah":"blah","blah":"blah" 
4
mysql --raw --skip-column-names -u someuser -psomepass -h somehost -b somedatabase -e "select * from somedatabase.sometable;"| awk -F\\t '{print $1","$2","$3}' 

-F\\t tells awk to use a tab as the delimeter on its input, and we print out the desired columns with commas as delimeters using the "," bit. Replace "," with ":" or "|" or whatever to suit your needs. 

Si necesita citar un campo ouput, digamos $ 1, su impresión awk se vería así:

awk -F\\t '{print "\""$1"\","$2","$3}' 
1

siguiendo el Change output format for MySQL command line results to CSV

 
mysql --skip-column-names --batch -e 'select * from dump3' t | awk -F'\t' '{ sep=""; for(i = 1; i <= NF; i++) { gsub(/\\t/,"\t",$i); gsub(/\\n/,"\n",$i); gsub(/\\\\/,"\\",$i); gsub(/"/,"\"\"",$i); printf sep"\""$i"\""; sep=","; if(i==NF){printf"\n"}}}' 
+0

Eso es mucho más complicado que la respuesta aceptada. ¿Por qué es esto mejor? – Mike

+0

hola, porque todas estas soluciones propagan el mismo error. No cumpla con las reglas básicas del formato CSV: https://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules * Los campos con comas incrustadas o comillas dobles deben citarse. * Cada uno de los caracteres de comillas dobles incrustados debe estar representado por un par de caracteres de comillas dobles. * Los campos con saltos de línea incrustados deben citarse El resultado será correcto solo en ese momento, cuando no haya coma ni "caracteres de nueva línea en el valor. –

+0

Por ejemplo, el resultado para tales dos columnas no podría leerse correctamente: mysql> select * from csvdata; | column1 | column2 | + -------------------------- + --------------------- ------------- + | Super, camión "lujoso" | Segunda columna y otra coma | Responda con SELECCIONE CONCAT_WS 'mysql> SELECCIONE CONCAT_WS (',', columna1, columna2) de csvdata; + ------------------------------------------------ ----------- + | Super, camión "lujoso", Segunda columna y otra coma | ' –

1

Pipe la respuesta a tr, así:

mysql <blah blah> -B | tr '\t' ',' 
+0

ah, perdí cosas en corchetes angulares ... quiero decir mysql {blah blah} -B ... –

Cuestiones relacionadas