Czy istnieje prosty sposób na uruchomienie zapytania MySQL z wiersza poleceń systemu Linux i wyświetlenie wyników w formacie CSV ?
Oto co teraz robię:
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/ /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ
Robi się bałagan, gdy istnieje wiele kolumn, które muszą być otoczone cudzysłowami, lub jeśli w wynikach są cudzysłowy, które należy uciec.
REPLACE()
w zapytaniu, aby uniknąć cytatów.Odpowiedzi:
From http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
Za pomocą tego polecenia nazwy kolumn nie będą eksportowane.
Zauważ też, że
/var/lib/mysql-files/orders.csv
będzie na serwerze, na którym działa MySQL. Użytkownik, na którym działa proces MySQL, musi mieć uprawnienia do zapisu w wybranym katalogu, w przeciwnym razie polecenie zakończy się niepowodzeniem.Jeśli chcesz zapisać dane wyjściowe na komputerze lokalnym ze zdalnego serwera (zwłaszcza hostowanego lub wirtualizowanego, takiego jak Heroku lub Amazon RDS), to rozwiązanie nie jest odpowiednie.
źródło
Który jest oddzielony tabulatorami. Prześlij go w ten sposób, aby uzyskać prawdziwy plik CSV (dzięki @therefromhere):
źródło
| sed 's/\t/,/g'
Otrzymasz plik rozdzielany tabulatorami. Ponieważ przecinki (lub ciągi zawierające przecinek) nie są poprzedzane znakami, zmiana separatora na przecinek nie jest prosta.
źródło
Oto dość srogi sposób na zrobienie tego. Znalazłem to gdzieś, nie mogę wziąć żadnego kredytu
mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv
Działa całkiem dobrze. Po raz kolejny wyrażenie regularne potwierdza tylko zapis.
Wyjaśnienie wyrażeń regularnych:
Podsumowując:
źródło
mysql -B
. Jeśli podzielisz regex na pojedyncze instrukcje w osobnych wierszach, zrozumienie tego będzie dość proste (dla kogoś, kto zna regex).","
i wiele innych rzeczy. Wyrażenie regularne nie jest sposobem na rozwiązanie tego problemuTylko Unix / Cygwin , przeprowadź go przez „tr”:
NB: Nie obsługuje to ani osadzonych przecinków, ani osadzonych kart.
źródło
To mnie uratowało kilka razy. Szybko i to działa!
Przykład:
Aby uzyskać kompletność, możesz przekonwertować na csv (ale uważaj, ponieważ tabulatory mogą znajdować się wewnątrz wartości pól - np. Pól tekstowych)
źródło
Rozwiązanie OUTFILE podane przez Paula Tomblina powoduje zapis pliku na samym serwerze MySQL, więc zadziała to tylko wtedy, gdy masz PLIK dostęp do , a także dostęp do logowania lub inne sposoby pobierania pliku z tego pola.
Jeśli nie masz takiego dostępu, a dane rozdzielane tabulatorami są rozsądnym zamiennikiem CSV (np. Jeśli Twoim ostatecznym celem jest import do Excela), to rozwiązanie Serbaut (przy użyciu
mysql --batch
i opcjonalnie--raw
) jest właściwą drogą.źródło
MySQL Workbench może eksportować zestawy rekordów do CSV i wydaje się, że bardzo dobrze radzi sobie z przecinkami w polach. CSV otwiera się w OpenOffice w porządku.
źródło
Co powiesz na:
źródło
mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
Wszystkie dotychczasowe rozwiązania, z wyjątkiem Workbench MySQL, są niepoprawne i prawdopodobnie niebezpieczne (np. Problemy z bezpieczeństwem) przynajmniej dla niektórych możliwych treści w db mysql.
MYSQL Workbench (i podobnie PHPMyAdmin) zapewniają formalnie poprawne rozwiązanie, ale są przeznaczone do pobierania danych wyjściowych do lokalizacji użytkownika. Nie są one tak przydatne do zautomatyzowania eksportu danych.
Nie można wygenerować wiarygodnego poprawnego pliku csv z danych wyjściowych
mysql -B -e 'SELECT ...'
ponieważ nie może on kodować powrotów karetki i białych znaków w polach. Flaga „-s” dla mysql powoduje ukośnik odwrotny i może prowadzić do poprawnego rozwiązania. Jednak korzystanie z języka skryptowego (takiego z przyzwoitymi wewnętrznymi strukturami danych, czyli bez basha) oraz bibliotek, w których problemy z kodowaniem zostały już dokładnie opracowane, jest znacznie bezpieczniejsze.Pomyślałem o napisaniu skryptu, ale gdy tylko pomyślałem, jak to nazwać, przyszło mi do głowy, aby poszukać wcześniej istniejącej pracy o tej samej nazwie. Chociaż nie omówiłem go dokładnie, rozwiązanie na https://github.com/robmiller/mysql2csv wygląda obiecująco. W zależności od aplikacji podejście yaml do określania poleceń SQL może jednak nie być atrakcyjne. Nie jestem też podekscytowany wymaganiem nowszej wersji Ruby niż jest standardowo w moim laptopie Ubuntu 12.04 lub serwerach Debian Squeeze. Tak, wiem, że mógłbym użyć RVM, ale wolałbym nie utrzymywać tego w tak prostym celu.
Mam nadzieję, że ktoś wskaże odpowiednie narzędzie, które poddano nieco testom. W przeciwnym razie prawdopodobnie zaktualizuję to, gdy ją znajdę lub napiszę.
źródło
Wiele odpowiedzi na tej stronie jest słabych, ponieważ nie obsługują ogólnego przypadku tego, co może się zdarzyć w formacie CSV. np. przecinki i cytaty osadzone w polach i inne warunki, które zawsze się pojawiają. Potrzebujemy ogólnego rozwiązania, które działa dla wszystkich prawidłowych danych wejściowych CSV.
Oto proste i silne rozwiązanie w Pythonie:
Nazwij ten plik
tab2csv
, umieść go na swojej ścieżce, nadaj mu uprawnienia do wykonywania, a następnie użyj go w następujący sposób:Funkcje obsługi CSV w Pythonie obejmują przypadki narożne dla formatów wejściowych CSV.
Można to poprawić, aby obsługiwać bardzo duże pliki za pomocą metody przesyłania strumieniowego.
źródło
Z poziomu wiersza poleceń możesz to zrobić:
Kredyty: Eksportowanie tabeli z Amazon RDS do pliku csv
źródło
CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;
źródło
Ta odpowiedź wykorzystuje Python i popularną bibliotekę zewnętrzną PyMySQL . Dodam go, ponieważ biblioteka csv Pythona jest wystarczająco potężna, aby poprawnie obsługiwać wiele różnych odmian
.csv
i żadne inne odpowiedzi nie używają kodu Python do interakcji z bazą danych.źródło
Jest to proste i działa na wszystkim bez potrzeby używania trybu wsadowego lub plików wyjściowych:
Wyjaśnienie:
"
się""
w każdej dziedzinie ->replace(field1, '"', '""')
concat('"', result1, '"')
concat_ws(',', quoted1, quoted2, ...)
Otóż to!
źródło
NULL
wartości zostaną pominięteconcat_ws()
, co spowoduje niedopasowanie kolumny. Aby tego uniknąć, po prostu użyj pustego ciągu:IFNULL(field, '')
(lub cokolwiek innego, co reprezentujeszNULL
)Alternatywnie do powyższej odpowiedzi możesz mieć tabelę MySQL, która korzysta z silnika CSV.
Następnie będziesz mieć plik na dysku twardym, który zawsze będzie w formacie CSV, który możesz po prostu skopiować bez przetwarzania.
źródło
Aby rozwinąć poprzednie odpowiedzi, następujący linijka eksportuje pojedynczą tabelę jako plik rozdzielany tabulatorami. Jest odpowiedni do automatyzacji, eksportuje bazę danych każdego dnia.
Dogodnie, możemy użyć tej samej techniki, aby wyświetlić tabele MySQL i opisać pola w pojedynczej tabeli:
źródło
mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
sed -e 's/\t/,/g'
jest bezpieczne tylko wtedy, gdy masz pewność, że Twoje dane nie zawierają przecinków ani kart.Opierając się na user7610, oto najlepszy sposób, aby to zrobić. Z
mysql outfile
było 60 minut z posiadania pliku i nadpisanie problemów.To nie jest fajne, ale zadziałało w 5 minut.
php csvdump.php localhost root password database tablename > whatever-you-like.csv
źródło
Ponadto, jeśli wykonujesz zapytanie w wierszu poleceń Bash, uważam, że
tr
można użyć tego polecenia, aby zastąpić domyślne tabulatory dowolnymi ogranicznikami.$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
źródło
Oto co robię:
Skrypt perla (snajperski skądinąd) wykonuje niezłą robotę, przekształcając pola z odstępami tabulatorów w CSV.
źródło
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '
- twój nie1.2.3
Nie do końca w formacie CSV, ale do zapisania danych wyjściowych w pliku lokalnym można użyć
tee
polecenia klienta MySQL :Możesz to wyłączyć za pomocą
notee
.Problem
SELECT … INTO OUTFILE …;
polega na tym, że wymaga on uprawnień do zapisywania plików na serwerze.źródło
Korzystając z rozwiązania opublikowanego przez Tima, stworzyłem ten skrypt bash, aby ułatwić proces (wymagane jest hasło roota, ale możesz łatwo zmodyfikować skrypt, aby poprosić o innego użytkownika):
Utworzy plik o nazwie: database.table.csv
źródło
Jeśli masz skonfigurowane PHP na serwerze, możesz użyć mysql2csv, aby wyeksportować (faktycznie prawidłowy) plik CSV dla zapytania mysql o wartościach bezwzględnych. Zobacz moją odpowiedź na MySQL - WYBIERZ * NA WYJŚCIE LOKALNE?trochę więcej kontekstu / informacji.
Próbowałem zachować nazwy opcji,
mysql
więc powinno wystarczyć podanie opcji--file
i--query
:„Zainstaluj”
mysql2csv
przez(pobierz zawartość listy, sprawdź sumę kontrolną i spraw, by była wykonywalna).
źródło
Co dla mnie zadziałało:
Żadne z rozwiązań w tym wątku nie działało w moim konkretnym przypadku, miałem ładne dane JSON w jednej z kolumn, które zostałyby pomieszane w moich wynikach CSV. W przypadku osób z podobnym problemem wypróbuj linie zakończone przez \ r \ n.
Kolejny problem dla tych, którzy próbują otworzyć plik csv za pomocą Microsoft Excel, pamiętaj, że istnieje limit 32 767 znaków, które może pomieścić pojedyncza komórka, ponad to przepełnia się do poniższych wierszy. Aby zidentyfikować, które rekordy w kolumnie mają problem, użyj poniższego zapytania. Następnie możesz obciąć te rekordy lub obsłużyć je, jak chcesz.
źródło
Jeśli pojawia się błąd
secure-file-priv
wtedy, również po zmianie lokalizacji docelowego pliku wewnątrz,C:\ProgramData\MySQL\MySQL Server 8.0\Uploads
a także po tym zapytanie-SELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
nie działa, musisz tylko zmienić
\
(backsplash) z zapytania na/
(forwardsplash)I to działa !!
Przykład:
Za każdym razem, gdy uruchomisz udane zapytanie, za każdym razem będzie generowany nowy plik csv! Fajnie, prawda?
źródło
Mały skrypt bash do wykonywania prostych zapytań do zrzutów CSV, zainspirowany https://stackoverflow.com/a/5395421/2841607 .
źródło
Poniższy skrypt bash działa dla mnie. Opcjonalnie pobiera również schemat dla żądanych tabel.
źródło
Napotkałem ten sam problem i odpowiedź Paula nie była opcją, ponieważ był to RDS. Zastąpienie karty przecinkami nie działało, ponieważ dane zawierały przecinki i tabulatory. Odkryłem, że mycli, które jest alternatywą dla klienta mysql, obsługuje wyjście csv z pola z
--csv
flagąźródło
Jeśli pojawia się ten błąd podczas próby wyeksportowania pliku
i nie możesz rozwiązać tego błędu. Możesz zrobić jedną rzecz, po prostu uruchamiając ten skrypt Pythona
źródło
Jeśli na używanym komputerze jest zainstalowany PHP, możesz napisać w tym celu skrypt PHP. Wymaga instalacji PHP z zainstalowanym rozszerzeniem MySQL.
Możesz wywołać interpretera PHP z wiersza poleceń w następujący sposób:
Włączam
--php-ini
przełącznik, ponieważ może być konieczne użycie własnej konfiguracji PHP, która włącza rozszerzenie MySQL. W PHP 5.3.0+ to rozszerzenie jest domyślnie włączone, więc nie jest już konieczne używanie konfiguracji, aby je włączyć.Następnie możesz napisać skrypt eksportu jak każdy normalny skrypt PHP:
Zaletą tej metody jest to, że nie ma problemów z varchar i polami tekstowymi, które zawierają tekst zawierający znaki nowej linii. Te pola są poprawnie cytowane, a nowe wiersze w nich będą interpretowane przez czytnik CSV jako część tekstu, a nie separatory rekordów. Jest to coś, co później trudno jest poprawić za pomocą sed lub tak dalej.
źródło