2011-01-04 6 views
12

Eventuali duplicati:
How to export/dump a MySql table into a text file including the field names (aka headers or column names)MySQL esegue il dump nei file di testo CSV con i nomi delle colonne nella parte superiore?

Io uso questo frammento SQL per scaricare una tabella in file di testo CSV:

SELECT * FROM marchio INTO OUTFILE "e:/marca. csv " CAMPI TERMINATI DA", "CHIUSO DA" "' LINEE TERMINATE DA" \ n ";

Tuttavia questo approccio non aggiunge i nomi delle colonne all'inizio del file CSV. La mia domanda è come selezionare tutti i nomi di colonna/campo, proprio come phpMyAdmin quando esporti la tabella e seleziona "Metti i nomi dei campi nella prima riga".

+0

check this out (si tratta di una soluzione alternativa): [file CSV Esportazione da MySQL con intestazioni in prima fila] (http://homepage.mac.com/kelleherk/iblog/C711669388/E20060511141025/index.html) –

risposta

16

Ho escogitato un modo per dover inserire manualmente quei nomi finché esegui MySQL 5 o versioni successive. Qui è, scritto come uno script bash per l'esecuzione su una riga di comando UNIX:

DBNAME=<database_name> 
TABLE=<table_name> 

FNAME=/path/to/output/dir/$(date +%Y.%m.%d)-$DBNAME.csv 

#(1)creates empty file and sets up column names using the information_schema 
mysql -u <username> -p<password> $DBNAME -B -e "SELECT COLUMN_NAME FROM information_schema.COLUMNS C WHERE table_name = '$TABLE';" | awk '{print $1}' | grep -iv ^COLUMN_NAME$ | sed 's/^/"/g;s/$/"/g' | tr '\n' ',' > $FNAME 

#(2)appends newline to mark beginning of data vs. column titles 
echo "" >> $FNAME 

#(3)dumps data from DB into /var/mysql/tempfile.csv 
mysql -u <username> -p<password> $DBNAME -B -e "SELECT * INTO OUTFILE '/var/mysql/tempfile.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' FROM $TABLE;" 

#(4)merges data file and file w/ column names 
cat /var/mysql/tempfile.csv >> $FNAME 

#(5)deletes tempfile 
rm -rf /var/mysql/tempfile.csv 

Pur non essendo la soluzione più aggraziata, sono sicuro che può essere compresso in una sola linea da qualcuno che conosce SQL e/o colpire un po 'meglio di me ...

ciò che fa è:

  1. utilizza lo schema informazioni di MySQL per creare un file CSV vuoto w/colonna
  2. Aggiunge una nuova riga in più per quel vuoto CSV così i tuoi dati inizieranno ad apparire una nuova linea
  3. utilizza un abbastanza standard "SELECT * INTO OUTFILE ..." query per creare un file CSV completa di dati
  4. aggiunge il file di dati sul file di w/colonna
  5. elimina i dati (temporaneo) file

Buona fortuna, e se la pulisci, pubblica i risultati!

8

Penso che questo faccia quello che vuoi. Sto usando mysql 5.1.60, questo invia i nomi dei campi sulla prima riga. Questo userà "\ t" come separatore di campo, non sono invece sicuro di come chiedere una virgola.

echo "SELECT * FROM brand;" | mysql -uXXX -pXXX databasename > brand.tsv 
+0

Questo non include i campi contenenti il ​​carattere virgola, quindi - a seconda della natura dei dati, ovviamente - generano potenzialmente un file CSV non valido. –

+0

@BobbyJack Se il separatore è scheda, non è più necessario preoccuparsi delle virgole ... – rloth

Problemi correlati