1401 Stimmen

Wie kann ich MySQL-Abfrageergebnisse im CSV-Format ausgeben?

Gibt es eine einfache Möglichkeit, eine MySQL-Abfrage von der Linux-Kommandozeile aus zu starten und die Ergebnisse in CSV Format?

Das 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 unübersichtlich, wenn es viele Spalten gibt, die von Anführungszeichen umgeben werden müssen, oder wenn es Anführungszeichen in den Ergebnissen gibt, die escaped werden müssen.

1 Stimmen

Sie können verwenden REPLACE() in Ihrer Abfrage, um die Anführungszeichen auszulassen.

0 Stimmen

Sehen Sie sich meine Antwort in [diesem Stackoverflow][1] [1] an: stackoverflow.com/questions/12242772/

0 Stimmen

1984voto

Paul Tomblin Punkte 172816

De Speichern von MySQL-Abfrageergebnissen in einer Text- oder CSV-Datei :

SELECT order_id,product_name,qty
FROM orders
WHERE foo = 'bar'
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Hinweis: Diese Syntax muss möglicherweise neu geordnet werden, um

SELECT order_id,product_name,qty
INTO OUTFILE '/var/lib/mysql-files/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM orders
WHERE foo = 'bar';

in neueren Versionen von MySQL.

Bei Verwendung dieses Befehls werden die Spaltennamen nicht exportiert.

Beachten Sie auch, dass /var/lib/mysql-files/orders.csv wird in der Server auf dem MySQL läuft. Der Benutzer, unter dem der MySQL-Prozess läuft, muss Schreibrechte für das ausgewählte Verzeichnis haben, sonst schlägt der Befehl fehl.

Wenn Sie die Ausgabe eines entfernten Servers (insbesondere eines gehosteten oder virtualisierten Rechners wie Heroku o Amazon RDS ), ist diese Lösung nicht geeignet.

8 Stimmen

Möglicherweise müssen Sie Root sein. "Die Datei wird auf dem Server-Host erstellt, daher müssen Sie über das Recht DATEI verfügen, um diese Syntax zu verwenden." - dev.mysql.com/doc/refman/8.0/de/select-into.html

0 Stimmen

Ja, es ist sowohl auf MySQL-Rechte als auch auf Schreibrechte irgendwo im lokalen Dateisystem angewiesen.

0 Stimmen

LINES TERMINATED BY '\n' ist nicht notwendig, es ist die Standardeinstellung. Wenn Sie alle zusätzlichen Parameter weglassen, erhalten Sie im Allgemeinen eine tabulatorgetrennte Datei, in der die Felder nicht eingeschlossen sind.

547voto

Stan Punkte 8234
mysql your_database --password=foo < my_requests.sql > out.tsv

Dies ergibt ein durch Tabulatoren getrenntes Format. Wenn Sie sicher sind, dass keine Kommas in den Spaltendaten vorkommen (und auch keine Tabulatoren), können Sie diesen Pipe-Befehl verwenden, um eine echte CSV-Datei zu erhalten (danke zum Benutzer John Carter ):

... .sql | sed 's/\t/,/g' > out.csv

132 Stimmen

Die sed-"Korrektur" kompensiert keine Kommas, die in den ausgewählten Daten vorkommen können, und verzerrt die ausgegebenen Spalten entsprechend

235voto

serbaut Punkte 5672

mysql --batch, -B

Die Ergebnisse werden mit Tabulator als Spaltentrennzeichen gedruckt, wobei jede Zeile in eine neuen Zeile. Mit dieser Option benutzt mysql nicht die History-Datei. Der Batch-Modus führt zu einem nicht-tabellarischen Ausgabeformat und zum Escaping von Sonderzeichen. Escaping kann durch Verwendung des Raw-Modus deaktiviert werden; siehe die Beschreibung der Option --raw.

Sie erhalten dann eine durch Tabulatoren getrennte Datei. Da Kommas (oder Zeichenketten, die Kommas enthalten) nicht escaped werden, ist es nicht einfach, das Trennzeichen in ein Komma zu ändern.

194voto

Tim Harding Punkte 2635

Hier ist eine ziemlich krasse Art, das zu tun [1] :

mysql --user=wibble --password wobble -B -e "select * from vehicle_categories;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > vehicle_categories.csv

Das funktioniert ziemlich gut. Aber auch hier beweist ein regulärer Ausdruck, dass er schreibgeschützt ist.


Regex Erläuterung:

  • s/// bedeutet, dass das, was zwischen dem ersten // steht, durch das ersetzt wird, was zwischen dem zweiten // steht.
  • das "g" am Ende ist ein Modifikator, der "alle Instanzen, nicht nur die erste" bedeutet
  • ^ (in diesem Zusammenhang) bedeutet Anfang der Zeile
  • $ (in diesem Zusammenhang) bedeutet Ende der Zeile

Also, alles zusammengenommen:

s/'/\'/          Replace ' with \'
s/\t/\",\"/g     Replace all \t (tab) with ","
s/^/\"/          at the beginning of the line place a "
s/$/\"/          At the end of the line, place a "
s/\n//g          Replace all \n (newline) with nothing

[1] Ich habe es irgendwo gefunden und kann keine Lorbeeren dafür ernten.

0 Stimmen

Im Befehl ist ein Tippfehler enthalten: "--password=wobble"

1 Stimmen

@AydinÖzcan --password fordert den Benutzer nach der Ausführung des Befehls lediglich zur Eingabe eines Passworts auf. wobble ist der Name der Datenbank, aber ich stimme zu, dass dies nicht klar ist und habe es der Klarheit halber geändert. Danke.

0 Stimmen

Ich wünschte, ich könnte 100-mal upvote. die einzige Lösung, die für mich gearbeitet.

125voto

strickli Punkte 1403

Pipe es durch 'tr' (Unix/ Cygwin nur):

mysql <database> -e "<query here>" | tr '\t' ',' > data.csv

N.B.: Hier werden weder eingebettete Kommas noch eingebettete Tabulatoren behandelt.

5 Stimmen

Ich bin überrascht, dass diese Lösung so wenig Zuspruch findet. Die derzeit beste Lösung erfordert ein Privileg, das viele Datenbankbenutzer nicht haben (und das aus gutem Grund; es ist ein Sicherheitsrisiko für Administratoren, dieses Privileg zu vergeben). Ihre Lösung hier funktioniert ohne besondere Privilegien und könnte wahrscheinlich auch verbessert werden, um die Unzulänglichkeiten von Kommas oder Tabulatoren zu beheben, möglicherweise durch eine Ersetzung in der Abfrage selbst.

0 Stimmen

Das ist eine brillante Lösung, die perfekt funktioniert.

1 Stimmen

Zustimmen mit den Kommentaren hier, das ist genau das, was benötigt wird, um mysql Privilegien Hölle zu vermeiden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X