2008-11-04 15 views
15

W interpretatorze MySql bardzo łatwo zrzucić tabelę na ekran wraz z nazwami jej pól.Jak wyeksportować/zrzucić tabelę MySql do pliku tekstowego zawierającego nazwy pól (zwane również nagłówkami lub nazwami kolumn)

Wygląda na to, że nie ma prostego sposobu na wyeksportowanie tabeli do rozdzielonego tabulatorami pliku lub pliku CSV , w tym jego nagłówków kolumn.

Próbuję to zrobić za pomocą SQL lub wiersza poleceń systemu Linux, bez pisania programu w innym języku.

Dziękuję

Odpowiedz

19

Rurociągi zapytanie do klienta poleceń wysyła kartę oddzielone listę z nazwami kolumn jako pierwsza linia

$ echo "select * from surveys limit 5" | mysql -uroot -pGandalf surveys 
phone param1 param2 param3 param4 p0  p1  p2  p3  audio4 code time 
XXXXXXXXX  2008-07-02  11:17:23  XXXXXXXX  SAT  -  -  -  -  -  ERROR 2008-07-02 12:18:32 
XXXXXXXXX  2008-07-02  11:22:52  XXXXXXXX  SAT  -  -  -  -  -  COLGADO 2008-07-02 12:04:29 
XXXXXXXXX  2008-07-02  11:41:29  XXXXXXXX  SAT  -  -  -  -  -  COLGADO 2008-07-02 12:07:22 
XXXXXXXXX  2008-07-02  12:16:19  XXXXXXXX  SAT  1  1  1  9  XXXXXXXXX_4.wav  OK  2008-07-02 16:14:27 
XXXXXXXXX  2008-07-02  08:21:25  XXXXXXXX  SAT  1  1  1  1  XXXXXXXXX_4.wav  OK  2008-07-02 12:29:40 
+1

testowałem to i to działało jak reklamowane –

+3

To hack zamiast mysql pod warunkiem funkcjonować. Myślę, że może nie działać w przypadku innych systemów operacyjnych. – janetsmith

+1

To nie jest hack, per se. To oczywiście może nie działać w systemach, które nie zapewniają zarówno rozsądnego interfejsu wiersza poleceń, jak i klienta wiersza poleceń mysql. –

1

Można to zrobić za pomocą polecenia mysqldump. Spójrz na opcje - tab i --xml.

+0

Przetestowałem to i nie dało zadowalających wyników. Mianowicie "sudo mysqldump --user = root --pass = mypass -T/home/mydir mydb mytable" daje "mysqldump: Mam błąd: 1: Nie można utworzyć/zapisać do pliku" /home/mydir/mytable.txt " (Errcode: 13) przy wykonywaniu polecenia "SELECT INTO OUTFILE" " –

+0

Nie powinieneś używać sudo do tego. Upewnij się tylko, że uruchamiasz mysqldump z konta, które ma uprawnienia do zapisu w folderze wyjściowym, który wydaje się być tym błędem. –

+1

Dobrze, ale to działa, tworząc katalog z 777 uprawnieniami. Jednak nie wyświetlał nazw kolumn, tylko dane. –

9

Ten mały skrypt powinien to zrobić:

- 1. wybrać stół i plik wyjściowy tutaj/powinno to być jedyne wejście

select 'mytable' into @tableName; 
select 'c://temp/test.csv' into @outputFile; 

- 2. uzyskać nazwy kolumn w format, który będzie pasował do zapytania

select group_concat(concat("'",column_name, "'")) into @columnNames from information_schema.columns 
where [email protected]; 

- 3. Zbuduj zapytanie

SET @query = CONCAT(
"select * from 
((SELECT ",@columnNames,") 
UNION 
(SELECT * FROM `",@tableName,"`)) as a 
INTO OUTFILE '", @outputFile, "'"); 

- 4. wykonanie zapytania

PREPARE stmt FROM @query; 
EXECUTE stmt; 
+1

Czy kolumny uporządkowane według "SELECT * ..." będą w tej samej kolejności, co kolumny podane w zapytaniu information_schema.columns? Nie trolling tutaj - po prostu ciekawy ... –

+0

@ cafe876: Dzięki za to rozwiązanie. Zastanawiam się tylko, dlaczego apostrof jest "potrzebny". Jeśli usunę oba apostrofy, zapytanie nie zadziała. Jeśli chcę dodać ograniczenie (np: SELECT 'x> 1' INTO @constr) w tym wierszu: (SELECT * FROM '", @ tableName, "WHERE", @ cosntr,)) jako "-> to nie działa. Dowolny pomysł? – giordano

+0

@giordano: Jeśli chcesz uzyskać odpowiedź, prawdopodobnie będziesz musiał lepiej zdefiniować "nie działa"; na przykład jaki komunikat o błędzie widziałeś? Możesz również poprosić o osobne pytanie. Jednak backtick pozwala na użycie nazw kolumn zawierających nietypowe znaki. – LarsH

3

że osiągnięto to, że w ten sposób:

echo "select * from table"| mysql database -B -udbuser -puser_passwd | sed s/\\t/,/g > query_output.csv 

Opcja -B MySQL oddziela kolumny przez występy, które są przekształcane w przecinkami wykorzystaniem SED . Zauważ, że generowane są również nagłówki.

+0

Doskonale, to działało dla mnie. – thekingoftruth

+2

BTW, musiałem zamienić '\\ t' na OSX na' Ctrl-V' 't'. – thekingoftruth

+0

@thekingoftruth Dziękuję za to! W przeciwnym razie cała litera t na wyjściu zostanie zastąpiona przecinkami. – crlane

-1

Utworzono procedurę automatyzacji eksportu zawartości większej liczby tabel do pliku .csv za pomocą SELECT ... INTO OUTFILE. Jeśli potrzebujesz czegoś podobnego, zapoznaj się z poniższymi informacjami:

http://lifeboysays.wordpress.com/2012/06/23/mysql-how-to-export-data-to-csv-with-column-headers/.

Używa metody opisanej przez cafe876, ale będzie działać dla jednej lub całej serii tabel, a także można ustawić ogranicznik i cytować znak, który ma być użyty.

+0

Nie można znaleźć pliku później ... haha. – thekingoftruth

0

Użyłem powyższego polecenia i zmodyfikowałem zgodnie z moimi wymaganiami.
Musiałem dostać haseł kolumny z bazy danych wordpress mysql w pliku tekstowym, aby to zrobić użyłem następujących poniżej polecenia

echo "select user_pass from wp_users"| mysql -uroot -proot wp_database > passwordList.txt 
Powiązane problemy