Gibt es eine einfache Möglichkeit, eine MySQL-Abfrage über die Linux-Befehlszeile auszuführen und die Ergebnisse im CSV- Format auszugeben ?
Folgendes mache ich jetzt:
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/ /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ
Es wird chaotisch, wenn viele Spalten von Anführungszeichen umgeben sein müssen oder wenn die Ergebnisse Anführungszeichen enthalten, die maskiert werden müssen.
REPLACE()
in Ihrer Abfrage verwenden, dass die Anführungszeichen maskiert werden.Antworten:
Von http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/
Mit diesem Befehl werden Spaltennamen nicht exportiert.
Beachten Sie auch, dass
/var/lib/mysql-files/orders.csv
sich dies auf dem Server befindet, auf dem MySQL ausgeführt wird. Der Benutzer, unter dem der MySQL-Prozess ausgeführt wird, muss über Berechtigungen zum Schreiben in das ausgewählte Verzeichnis verfügen. Andernfalls schlägt der Befehl fehl.Wenn Sie eine Ausgabe von einem Remote-Server (insbesondere einem gehosteten oder virtualisierten Computer wie Heroku oder Amazon RDS) auf Ihren lokalen Computer schreiben möchten, ist diese Lösung nicht geeignet.
quelle
Welches ist tab getrennt. Pipe es so, um eine echte CSV zu erhalten (danke @therefromhere):
quelle
| sed 's/\t/,/g'
Dadurch erhalten Sie eine durch Tabulatoren getrennte Datei. Da Kommas (oder Zeichenfolgen, die Komma enthalten) nicht maskiert werden, ist es nicht einfach, das Trennzeichen in Komma zu ändern.
quelle
Hier ist eine ziemlich knorrige Art, es zu tun. Fand es irgendwo, kann keine Gutschrift nehmen
mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv
Funktioniert ziemlich gut. Noch einmal, obwohl ein regulärer Ausdruck nur das Schreiben beweist.
Regex Erklärung:
Also, alles zusammen:
quelle
mysql -B
. Wenn Sie den regulären Ausdruck in einzelne Anweisungen in separaten Zeilen unterteilen würden, wäre es (für jemanden, der den regulären Ausdruck kennt) recht einfach zu verstehen.","
und eine Reihe anderer Dinge enthält. Eine Regex ist nicht der Weg, um dieses Problem zu lösenNur Unix / Cygwin , leiten Sie es durch 'tr':
NB: Dies behandelt weder eingebettete Kommas noch eingebettete Registerkarten.
quelle
Das hat mich ein paar Mal gerettet. Schnell und es funktioniert!
Beispiel:
Der Vollständigkeit halber können Sie in CSV konvertieren (aber seien Sie vorsichtig, da sich Tabulatoren innerhalb von Feldwerten befinden können - z. B. Textfelder).
quelle
Die von Paul Tomblin bereitgestellte OUTFILE-Lösung bewirkt, dass eine Datei auf den MySQL-Server selbst geschrieben wird. Dies funktioniert also nur, wenn Sie über DATEI- Zugriff sowie Anmeldezugriff oder andere Mittel zum Abrufen der Datei aus dieser Box verfügen .
Wenn Sie keinen solchen Zugriff haben und die durch Tabulatoren getrennte Ausgabe ein angemessener Ersatz für CSV ist (z. B. wenn Ihr Endziel der Import in Excel ist), ist die Lösung von Serbaut (mit
mysql --batch
und optional--raw
) der richtige Weg.quelle
MySQL Workbench kann Datensatzgruppen in CSV exportieren und scheint Kommas in Feldern sehr gut zu verarbeiten. Die CSV wird in OpenOffice in Ordnung geöffnet.
quelle
Wie wäre es mit:
quelle
mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
Alle bisherigen Lösungen hier, mit Ausnahme der MySQL-Workbench, sind falsch und möglicherweise unsicher (dh Sicherheitsprobleme) für zumindest einige mögliche Inhalte in der MySQL-Datenbank.
MYSQL Workbench (und ähnlich PHPMyAdmin) bieten eine formal korrekte Lösung, dienen jedoch zum Herunterladen der Ausgabe an den Standort eines Benutzers. Sie sind nicht so nützlich für Dinge wie die Automatisierung des Datenexports.
Es ist nicht möglich, zuverlässig korrektes CSV aus der Ausgabe von zu generieren,
mysql -B -e 'SELECT ...'
da dies keine Wagenrückläufe und Leerzeichen in Feldern codieren kann. Das '-s'-Flag für MySQL führt zu einem Backslash-Escape und kann zu einer korrekten Lösung führen. Die Verwendung einer Skriptsprache (eine mit anständigen internen Datenstrukturen, dh nicht Bash) und Bibliotheken, in denen die Codierungsprobleme bereits sorgfältig ausgearbeitet wurden, ist jedoch weitaus sicherer.Ich dachte darüber nach, ein Skript dafür zu schreiben, aber sobald ich darüber nachdachte, wie ich es nennen würde, kam mir der Gedanke, nach bereits existierenden Arbeiten mit demselben Namen zu suchen. Obwohl ich nicht gründlich darauf eingegangen bin, sieht die Lösung unter https://github.com/robmiller/mysql2csv vielversprechend aus. Abhängig von Ihrer Anwendung kann der yaml-Ansatz zur Angabe der SQL-Befehle jedoch ansprechen oder auch nicht. Ich bin auch nicht begeistert von der Forderung nach einer neueren Version von Ruby, als sie standardmäßig mit meinem Ubuntu 12.04-Laptop oder Debian Squeeze-Servern geliefert wird. Ja, ich weiß, dass ich RVM verwenden könnte, aber ich würde das lieber nicht für einen so einfachen Zweck beibehalten.
Hoffentlich wird jemand auf ein geeignetes Werkzeug hinweisen, das ein bisschen getestet wurde. Andernfalls werde ich dies wahrscheinlich aktualisieren, wenn ich einen finde oder schreibe.
quelle
Viele der Antworten auf dieser Seite sind schwach, da sie nicht den allgemeinen Fall behandeln, was im CSV-Format auftreten kann. zB Kommas und Anführungszeichen, eingebettet in Felder und andere Bedingungen, die immer irgendwann auftreten. Wir brauchen eine allgemeine Lösung, die für alle gültigen CSV-Eingabedaten funktioniert.
Hier ist eine einfache und starke Lösung in Python:
Benennen Sie diese Datei
tab2csv
, fügen Sie sie in Ihren Pfad ein, geben Sie ihr Ausführungsberechtigungen und verwenden Sie sie dann wie folgt:Die Python-CSV-Handhabungsfunktionen decken Eckfälle für CSV-Eingabeformate ab.
Dies könnte verbessert werden, um sehr große Dateien über einen Streaming-Ansatz zu verarbeiten.
quelle
Über Ihre Befehlszeile können Sie Folgendes tun:
Credits: Exportieren einer Tabelle aus Amazon RDS in eine CSV-Datei
quelle
CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;
quelle
Diese Antwort verwendet Python und eine beliebte Bibliothek von Drittanbietern , PyMySQL . Ich füge es hinzu, weil die CSV- Bibliothek von Python leistungsstark genug ist, um viele verschiedene Varianten korrekt zu verarbeiten,
.csv
und keine anderen Antworten Python-Code für die Interaktion mit der Datenbank verwenden.quelle
Dies ist einfach und funktioniert für alles, ohne dass ein Batch-Modus oder Ausgabedateien erforderlich sind:
Erläuterung:
"
mit""
in jedem Feld ->replace(field1, '"', '""')
concat('"', result1, '"')
concat_ws(',', quoted1, quoted2, ...)
Das ist es!
quelle
NULL
Werte übersprungen werdenconcat_ws()
, was zu einer Nichtübereinstimmung der Spalten führt. Um dies zu vermeiden, verwenden Sie stattdessen einfach eine leere Zeichenfolge:IFNULL(field, '')
(oder was auch immer Sie sonst darstellenNULL
)Alternativ zur obigen Antwort können Sie eine MySQL-Tabelle verwenden, die die CSV-Engine verwendet.
Dann haben Sie eine Datei auf Ihrer Festplatte, die immer in einem CSV-Format vorliegt, das Sie einfach kopieren können, ohne sie zu verarbeiten.
quelle
Um frühere Antworten zu erweitern, exportiert der folgende Einzeiler eine einzelne Tabelle als durch Tabulatoren getrennte Datei. Es eignet sich für die Automatisierung und exportiert die Datenbank jeden Tag oder so.
Praktischerweise können wir dieselbe Technik verwenden, um die Tabellen von MySQL aufzulisten und die Felder in einer einzelnen Tabelle zu beschreiben:
quelle
mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
sed -e 's/\t/,/g'
ist nur dann sicher, wenn Sie sicher sind, dass Ihre Daten keine Kommas oder Tabulatoren enthalten.Aufbauend auf user7610 ist hier der beste Weg, dies zu tun. Mit
mysql outfile
gab es 60 Minuten Dateibesitz und Überschreibprobleme.Es ist nicht cool, aber es hat in 5 Minuten funktioniert.
php csvdump.php localhost root password database tablename > whatever-you-like.csv
quelle
Wenn Sie die Abfrage in der Bash-Befehlszeile ausführen, kann der Befehl meines Erachtens
tr
verwendet werden, um die Standardregisterkarten durch beliebige Trennzeichen zu ersetzen.$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
quelle
Folgendes mache ich:
Das Perl-Skript (von einer anderen Stelle abgeschnitten) macht einen guten Job beim Konvertieren der Felder mit Tabulatorabstand in CSV.
quelle
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '
- Ihre würden nicht zitieren1.2.3
Nicht genau als CSV-Format, aber der
tee
Befehl vom MySQL- Client kann verwendet werden, um die Ausgabe in einer lokalen Datei zu speichern:Sie können es mit deaktivieren
notee
.Das Problem dabei
SELECT … INTO OUTFILE …;
ist, dass zum Schreiben von Dateien auf dem Server eine Berechtigung erforderlich ist.quelle
Mit der von Tim veröffentlichten Lösung habe ich dieses Bash-Skript erstellt, um den Prozess zu vereinfachen (Root-Passwort wird angefordert, aber Sie können das Skript leicht ändern, um nach einem anderen Benutzer zu fragen):
Es wird eine Datei mit dem Namen database.table.csv erstellt
quelle
Wenn Sie PHP auf dem Server eingerichtet haben, können Sie mit mysql2csv eine (tatsächlich gültige) CSV-Datei für eine beliebige mysql-Abfrage exportieren. Siehe meine Antwort bei MySQL - SELECT * INTO OUTFILE LOCAL? für ein bisschen mehr Kontext / Info.
Ich habe versucht, die Optionsnamen von beizubehalten,
mysql
daher sollte es ausreichen, die Optionen--file
und--query
anzugeben:"Installieren"
mysql2csv
über(Laden Sie den Inhalt der Liste herunter, überprüfen Sie die Prüfsumme und machen Sie sie ausführbar).
quelle
Was hat bei mir funktioniert:
Keine der Lösungen in diesem Thread funktionierte für meinen speziellen Fall. Ich hatte hübsche JSON-Daten in einer der Spalten, die in meiner CSV-Ausgabe durcheinander geraten würden. Versuchen Sie für diejenigen mit einem ähnlichen Problem stattdessen Zeilen, die mit \ r \ n abgeschlossen sind.
Ein weiteres Problem für diejenigen, die versuchen, die CSV mit Microsoft Excel zu öffnen. Beachten Sie, dass eine einzelne Zelle maximal 32.767 Zeichen enthalten kann und darüber hinaus in die folgenden Zeilen überläuft. Verwenden Sie die folgende Abfrage, um festzustellen, bei welchen Datensätzen in einer Spalte das Problem auftritt. Sie können diese Datensätze dann abschneiden oder nach Belieben behandeln.
quelle
Wenn Sie dann eine Fehlermeldung erhalten
secure-file-priv
, auch nach dem Verschieben des Speicherorts IhrerC:\ProgramData\MySQL\MySQL Server 8.0\Uploads
Zieldatei innerhalb der und auch danach die Abfrage-SELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
funktioniert nicht, Sie müssen nur
\
(Backsplash) von der Abfrage zu/
(Forwardsplash) ändern.Und das funktioniert !!
Beispiel:
Jedes Mal, wenn Sie die erfolgreiche Abfrage ausführen, wird jedes Mal die neue CSV-Datei generiert! Cool, oder?
quelle
Winziges Bash-Skript zum einfachen Abfragen von CSV-Dumps, inspiriert von https://stackoverflow.com/a/5395421/2841607 .
quelle
Das folgende Bash-Skript funktioniert für mich. Optional wird auch das Schema für die angeforderten Tabellen abgerufen.
quelle
Ich stieß auf das gleiche Problem und Pauls Antwort war keine Option, da es sich um RDS handelte. Das Ersetzen der Registerkarte durch Kommas funktionierte nicht, da in die Daten Kommas und Registerkarten eingebettet waren. Ich fand heraus, dass mycli , eine Drop-In-Alternative für den mysql-Client, die sofort verfügbare CSV-Ausgabe mit dem
--csv
Flag unterstütztquelle
Wenn Sie diese Fehlermeldung erhalten, während Sie versuchen, Ihre Datei zu exportieren
und Sie können diesen Fehler nicht beheben. Sie können eine Sache tun, indem Sie einfach dieses Python-Skript ausführen
quelle
Wenn auf dem von Ihnen verwendeten Computer PHP installiert ist, können Sie dazu ein PHP-Skript schreiben. Für die PHP-Installation muss die MySQL-Erweiterung installiert sein.
Sie können den PHP-Interpreter über die Befehlszeile wie folgt aufrufen:
Ich schließe den
--php-ini
Switch ein, da Sie möglicherweise Ihre eigene PHP-Konfiguration verwenden müssen, die die MySQL-Erweiterung aktiviert. Unter PHP 5.3.0+ ist diese Erweiterung standardmäßig aktiviert, sodass die Konfiguration nicht mehr zum Aktivieren verwendet werden muss.Dann können Sie Ihr Exportskript wie jedes normale PHP-Skript schreiben:
Der Vorteil dieser Methode ist, dass sie keine Probleme mit Varchar- und Textfeldern hat, deren Text Zeilenumbrüche enthält. Diese Felder werden korrekt in Anführungszeichen gesetzt und diese Zeilenumbrüche werden vom CSV-Reader als Teil des Textes interpretiert, nicht als Trennzeichen. Das ist etwas, das mit sed oder so schwer zu korrigieren ist .
quelle