Come esportare un file CSV dalla riga di comando di MySQL

Contenuti

Trasporto dati tra applicazioni.

File di valori separati da virgole (CSV) sono un modo per trasferire dati tra applicazioni. Database come MySQL e software per fogli di calcolo come Excel supportano l'importazione e l'esportazione tramite CSV, quindi puoi usare File CSV scambiare dati tra i due.

I file CSV sono di testo normale, quindi sono naturalmente leggeri e facili da esportare da MySQL.

Dal server di database

Se si ha accesso al server su cui è in esecuzione MySQL, È possibile esportare una selezione con il comando INTO OUTFILE comando.

SELECT id, colonna1, column2 FROM table
INTO OUTFILE '/tmp/mysqlfiles/table.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY 'n'

Questo genererà un file CSV per /tmp/mysqlfiles/table.csv, o dove l'hai configurato. Dovrai assicurarti che l'utente che esegue MySQL (in genere mysql oh root) ha la proprietà e l'accesso in scrittura alla directory.

Dovrai anche assicurarti che secure_file_priv La configurazione consente a MySQL di accedere a quella directory. Questo, per impostazione predefinita, blocca l'accesso in lettura e scrittura alle query SQL. Questa è una buona cosa; se il tuo codice è vulnerabile a SQL injection, qualsiasi potenziale aggressore avrebbe accesso solo a MySQL e non al resto del filesystem.

Puoi autorizzare directory specifiche modificando il file di configurazione di MySQL (generalmente situato in /etc/my.cnf) includere:

[mysqld]
secure-file-priv = "/tmp/mysqlfiles"

Che consentirà a MySQL di leggere e scrivere su /tmp/mysqlfiles/ (con cosa dovresti creare mkdir). Una volta che MySQL può esportare i file, dovrebbe essere in grado di eseguire la query e generare file CSV.

Con il ENCLOSED BY collocamento, le virgole saranno correttamente sfuggite, come esempio:

"3","Fuga, questo","anche, questo"

Che puoi prendere e importare direttamente in qualsiasi programma di fogli di calcolo o altro software.

Foglio di calcolo di un elenco separato da virgole.

Tieni presente che il file CSV esportato non include le intestazioni di colonna, ma le colonne saranno nello stesso ordine delle SELECT dichiarazione. Allo stesso tempo, i valori null verranno esportati come N, qual è il comportamento previsto?, ma se vuoi cambiarlo, puoi modificare la selezione avvolgendo ifnull(field, "") intorno ai loro campi nella loro SELECT dichiarazione.

Dalla riga di comando di MySQL

Se hai solo accesso dalla riga di comando all'istanza MySQL, e non hai accesso al server stesso (come quando non ci riesci, in caso di Amazon RDS), il problema è un po' più complesso. Mentre puoi usare FIELDS TERMINATED BY ',' sul server per generare un elenco separato da virgole, La CLI di MySQL sarà a schede per impostazione predefinita.

Basta inserire una query dalla riga di comando e reindirizzarla a un file:

mysql -u root -e "Selezionare * dal database;" > output.tsv

Perché l'output di MySQL è a schede, questo si chiama file TSV, per “valori separati da tabulazione”, e potrebbe funzionare al posto del tuo file CSV in alcuni programmi, come le importazioni di fogli di calcolo. Ma non è un file CSV e convertirlo in uno è complicato.

Potresti semplicemente sostituire ogni scheda con una virgola, che funzionerebbe ma causerebbe il fallimento se ci sono virgole nei dati di input. Se sei assolutamente sicuro che non ci siano virgole nel tuo file TSV (consultare grep), puoi sostituire le schede con sed:

sed "s/t/,/g" output.tsv > output.csv

Ma se hai virgole nei tuoi dati, dovrai usare a molto più a lungo frase normale:

sed "S/'/'/;ns/","/G;s/^/"/;s/$/"/;s/n//g" output.tsv > output.csv

Questo uscirà correttamente dai campi tra virgolette, cosa risolverà il problema delle virgole?.

Nota: il carattere di tabulazione t è non standard. Su macOS e BSD, non è abilitato, che genera un disordine di ciascuno “T” minuscolo che causa sed inserire virgole sbagliate. Per risolvere questo, devi usare un carattere di tabulazione letterale invece di t:

sed "s/ /,/g" output.tsv > output.csv

Se i tuoi dati di input contengono schede, sei sfortunato e dovrai generare tu stesso un file CSV con un linguaggio di scripting.

Fallo manualmente con un vero linguaggio di programmazione

MySQL (e la maggior parte dei database) sono progettati per interagire con lui, quindi probabilmente hai già un qualche tipo di linguaggio di programmazione connesso a MySQL. La maggior parte delle lingue può anche scrivere su disco, così puoi creare i tuoi script di output CSV leggendo direttamente i campi del database, salvandoli correttamente e scrivendo un file delimitato da virgole.

Un esempio in Python.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.