2009-04-01 9 views
23

Sto provando a generare risultati di query in formato delimitato da virgole usando lo strumento da riga di comando mysql. Il mio utente mysql non ha accesso per utilizzare l'opzione "INTO OUTFILE" si fa riferimento in questa domanda:Come si generano i risultati delle query MySQL in formato csv (sullo schermo, non su un file)?

How to output MySQL query results in CSV format?

Sono anche consapevole del -H e opzioni -X per formattare rispettivamente output in HTML e XML , ma non c'è modo di esportare il formato CSV direttamente sullo schermo?

Ho trovato questo metodo utilizzando sed - http://tlug.dnho.net/?q=node/209. Ma sono curioso di trovare una soluzione diretta per mysql.

Qualche idea?

risposta

15

Ho finito solo prendendo l'uscita delimitato da tabulazioni e copia incolla in un foglio di calcolo e quindi l'esportazione che per csv. Ho anche capito che avrei potuto usare la funzione concat o concat_ws per fare il lavoro e lo farò la prossima volta.

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

SELEZIONA CONCAT_WS ('', campo1, campo2, field3) FROM tabella;

+3

Si consiglia di utilizzare l'opzione '--silent' per rimuovere l'output tabulare. Vedi http://dev.mysql.com/doc/refman/5.5/en/mysql-command-options.html#option_mysql_silent – Nobu

3

Utilizzo MySQL da anni e non conosco alcun modo per utilizzare il client da riga di comando mysql per produrre l'output CSV, ad eccezione delle soluzioni che hai già trovato.

ci sono un paio di richieste di funzionalità in archivio per il supporto di output CSV:

L'unica altra soluzione vorrei suggerire è quello di scrivere uno script in Perl o PHP, per recuperare i dati da MySQL e inviarli in formato CSV o qualsiasi altro formato desiderato. Questo non è uno script difficile da scrivere.

+0

Buono a sapere che non mi manca qualcosa di ovvio. Grazie! – RyanW

1

Se si ha accesso a mysqldump è possibile utilizzare qualcosa di simile

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

Grazie per l'idea. Penso che avrebbe funzionato intorno al mio problema con le autorizzazioni. Ma dovrei ulteriormente filtrare i record e i campi perché scaricherebbe un'intera tabella e stavo solo cercando di ottenere un piccolo sottoinsieme della tabella. – RyanW

+0

Le versioni recenti di mysqldump prendono un parametro -w per fornire una clausola WHERE alla tabella di dumping. – staticsan

+0

Grazie, sarebbe un'ottima alternativa. – RyanW

1

La CLI può produrre in formato delimitato da tabulazioni, che è abbastanza buono (parlo per esperienza). Usa l'opzione -B. Il problema più grande con delimitato da tabulazioni è che non posso importare Excel in quel formato. Tuttavia, OpenOffice lo fa.

+0

Esattamente, ho usato l'opzione -B e ho preso l'output e incollato in Numbers, che sembrano accettalo bene. – RyanW

+1

Grazie, ha funzionato alla grande. Quindi puoi usare sed per renderlo un CSV. Assicurati di digitare Ctrl-V prima della scheda nell'istruzione Sed. mysql -B -uroot foo -e 'SELECT email, paese FROM email_signups' | sed -e 's/ /,/g'> foo.csv –

2

Se MySQL Workbench è installato, è possibile eseguire una query, quindi fare clic su "esporta" sopra i risultati. Ti darà la possibilità di salvare come .CSV.

0

Se si utilizza MySQL in modo interattivo, è possibile impostare il cercapersone per utilizzare sed in questo modo:

$ 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" 

Se non si utilizza vedono come il cercapersone l'output è simile a questo:

"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. 

Se è necessario citare un campo ouput, permette di dire $ 1, la vostra stampa awk sarebbe simile a questa:

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

seguendo la 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

Questo è sicuramente molto più complicato della risposta accettata. Perché è meglio? – Mike

+0

hi, perché tutte queste soluzioni propagano lo stesso errore. Non soddisfare le regole di base del formato CSV: https://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules * I campi con virgolette incorporate o caratteri a virgolette devono essere citati. * Ciascuno dei caratteri di doppia quota incorporati deve essere rappresentato da una coppia di caratteri a virgolette. * I campi con interruzioni di linea incorporate devono essere quotati Il risultato sarà corretto solo allora, quando non ci sono virgole né "né caratteri di nuova riga nel valore. –

+0

Ad esempio, il risultato per queste due colonne non può essere letto correttamente: mysql> select * from csvdata; | colonna1 | colonna2 | + -------------------------- + --------------------- ------------- + | Super, camion "lussuoso" | Seconda colonna e un'altra virgola | Risposta con SELECT CONCAT_WS 'mysql> SELEZIONA CONCAT_WS (',', colonna1, colonna2) da csvdata; + ------------------------------------------------ ----------- + | Super, camion "lussuoso", seconda colonna e un'altra virgola | ' –

1

tubo la risposta a tr, in questo modo:

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

ah ci mancava roba tra parentesi angolari ... voglio dire mysql {blah blah} -B ... –

Problemi correlati