Wie erfolgt die Ausgabe MySQL Query-Ergebnisse im CSV-Format?
Frage
Gibt es eine einfache Möglichkeit, eine MySQL-Abfrage aus der Linux-Kommandozeile und gibt die Ergebnisse in läuft CSV Format?
Hier ist, was ich tue 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 es eine Menge von Spalten, die in Anführungszeichen gesetzt werden müssen, oder wenn es Anführungszeichen in den Ergebnissen ist, die maskiert werden müssen.
Lösung
Andere Tipps
$ mysql your_database --password=foo < my_requests.sql > out.csv
Welche ist Tab getrennt. Rohr, dass es so bekommt eine echte CSV (dank @therefromhere):
... .sql | sed 's/\t/,/g' > out.csv
mysql --batch, -B
Druckergebnisse mit Tabulator als Spaltentrennzeichen, wobei jede Zeile auf einem Neue Zeile. Mit dieser Option nicht verwendet mysql nicht die History-Datei. Batch-Modus führt zu einer nicht-tabellarischem Ausgabeformat und Flucht von spezielle Charaktere. Flüchten kann unter Verwendung von Raw-Modus deaktiviert werden; sehen die Beschreibung für die --raw Option.
Dies wird Ihnen eine Registerkarte getrennte Datei. Da Komma (oder Zeichenketten enthalten Komma) ist es nicht entgangen sind, ist nicht einfach, die Trennzeichen Komma zu ändern.
Hier ist eine ziemlich knorrige Art und Weise tun. Fand es irgendwo, kann kein Guthaben 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. Wieder wenn ein regulärer Ausdruck nur beweist schreiben.
Regex Erläuterung:
- s /// bedeutet Ersatz, was zwischen dem ersten // mit dem, was zwischen dem zweiten //
- das „g“ am Ende ist ein Modifikator, der „alle Instanz, nicht nur erste“ bedeutet
- ^ (in diesem Zusammenhang) bedeutet den Anfang der Zeile
- $ (in diesem Zusammenhang) bedeutet Ende der Zeile
Also, setzen sie alle zusammen:
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
Unix / Cygwin nur, Rohr es durch 'tr':
mysql <database> -e "<query here>" | tr '\t' ',' > data.csv
N. B .: Diese Griffe weder eingebettete Kommas, noch eingebettete Registerkarten.
Das ersparte mir ein paar Mal. Schnell und es funktioniert!
--batch Druckergebnisse mit als Spaltentrennzeichen, mit jeder Zeile auf einem neue Zeile.
--raw < em> deaktiviert Zeichen entweichenden (\ n \ t, \ 0 und \)
Beispiel:
mysql -udemo_user -p -h127.0.0.1 --port=3306 \
--default-character-set=utf8mb4 --database=demo_database \
--batch --raw < /tmp/demo_sql_query.sql > /tmp/demo_csv_export.tsv
Der Vollständigkeit halber können Sie konvertieren csv (aber vorsichtig , weil Tabs innen sein könnte Feldwerte - zB Textfelder)
tr '\t' ',' < file.tsv > file.csv
Die OUTFILE Lösung von Paul Tomblin gegeben bewirkt eine Datei auf dem MySQL-Server geschrieben werden sich, so wird dies nur funktionieren, wenn Sie
MySQL Workbench kann Cord-Sets zu CSV exportieren, und es scheint sehr Kommas in Feldern zu handhaben Gut. Die CSV öffnet in Openoffice fein auf.
Wie wäre:
mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv
Alle Lösungen hier bisher, mit Ausnahme der MySQL Workbench ein, sind falsch und möglicherweise unsicher (dh Sicherheitsfragen) für zumindest einigen möglichen Inhalt in der MySQL-Datenbank.
MYSQL Workbench (und in ähnlicher Weise PHPMyAdmin) eine formal korrekte Lösung, sind aber für den Download der Ausgabe an den Standort eines Nutzers gestaltet. Sie sind nicht so nützlich für Dinge wie Datenexport zu automatisieren.
Es ist nicht möglich, zuverlässig korrekten csv vom Ausgang des mysql -B -e 'SELECT ...'
zu erzeugen, weil das nicht Zeilenumbruch und Leerraum in den Feldern kodieren kann. Die ‚es‘ Flag mysql macht Backslash und könnte zu einer richtigen Lösung führen. Verwendung einer Skriptsprache (eine mit anständigen internen Datenstrukturen, die bash ist, nicht) jedoch und Bibliotheken, in denen die Codierung Probleme bereits sorgfältig ausgearbeitet ist viel sicherer.
Ich dachte über ein Skript für das Schreiben, aber sobald ich darüber nachgedacht, was ich es nennen würde, kam mir den Gedanken für bereits bestehende Arbeit mit dem gleichen Namen zu suchen. Während ich nicht gründlich darüber gegangen, die Lösung bei https://github.com/robmiller/mysql2csv sieht vielversprechend aus. Je nach Anwendung, der yaml Ansatz könnte die SQL-Befehle zu spezifizieren oder ansprechen könnte allerdings nicht. Ich bin auch nicht begeistert, mit der Forderung nach einer neueren Version von Ruby als serienmäßig mit meinem Ubuntu 12.04 Laptop oder Debian Squeeze-Servern. Ja, ich weiß, ich könnte RVM, aber ich möchte lieber nicht, dass für einen solchen einfachen Zweck halten.
Hoffentlich wird jemand mit einem geeigneten Werkzeug weist darauf hin, das ist ein wenig getestet hat. Ansonsten werde ich wahrscheinlich diese aktualisieren, wenn ich einen finden oder schreiben.
Von der Befehlszeile, Sie können dies tun:
mysql -h *hostname* -P *port number* --database=*database_name* -u *username* -p -e *your SQL query* | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > *output_file_name.csv*
Credits: exportieren Tabelle von Amazon RDS in eine cSV-Datei
Viele der Antworten auf dieser Seite sind schwach, weil sie den allgemeinen Fall nicht verarbeiten, was im CSV-Format auftreten kann. z.B. Kommas und Anführungszeichen in Feldern und anderen Bedingungen eingebettet, die immer schließlich kommen. Wir brauchen eine allgemeine Lösung, die für alle gültigen CSV Eingangsdaten funktioniert.
Hier ist eine einfache und starke Lösung in Python:
#!/usr/bin/env python
import csv
import sys
tab_in = csv.reader(sys.stdin, dialect=csv.excel_tab)
comma_out = csv.writer(sys.stdout, dialect=csv.excel)
for row in tab_in:
comma_out.writerow(row)
Name, der Datei tab2csv
, setzen Sie es auf Ihrem Weg, geben Sie ihm Berechtigungen auszuführen, ist es dann wie folgt verwenden:
mysql OTHER_OPTIONS --batch --execute='select * from whatever;' | tab2csv > outfile.csv
Die Python CSV-Handling-Funktionen abdecken Eckfällen für CSV-Eingabeformat (s).
Dies könnte verbessert werden sehr große Dateien über einen Streaming-Ansatz zu behandeln.
- Logik:
CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;
Wenn Sie eine CSV-Tabelle erstellen, erstellt der Server eine Tabellenformatdatei in das Datenbankverzeichnis. Die Datei beginnt mit dem Tabellennamen und hat eine FRM-Erweiterung. Die Speicher-Engine schafft auch eine Datendatei. Seinen Namen Tabellenname beginnt mit und verfügt über eine CSV-Erweiterung. Die Datendatei ist eine einfache Textdatei. Wenn Sie Daten in der Tabelle zu speichern, die Speicher Motor speichert sie in der Datendatei in kommagetrennte Werte.
Das ist einfach, und es funktioniert auf etwas ohne Batch-Modus oder Ausgabedateien zu benötigen:
select concat_ws(',',
concat('"', replace(field1, '"', '""'), '"'),
concat('"', replace(field2, '"', '""'), '"'),
concat('"', replace(field3, '"', '""'), '"'))
from your_table where etc;
Erklärung:
- Ersetzen
"
mit""
in jedem Feld ->replace(field1, '"', '""')
- Surround jedes Ergebnis in Anführungszeichen ->
concat('"', result1, '"')
- Stellen Sie ein Komma zwischen dem zitierten Ergebnis ->
concat_ws(',', quoted1, quoted2, ...)
Das ist es!
Diese Antwort verwendet Python und eine beliebte Dritte Bibliothek, PyMySQL . Ich füge es, weil Python csv Bibliothek ist stark genug, um richtig viele verschiedene Geschmacksrichtungen von .csv
handhaben und keine anderen Antworten Python-Code verwenden, um mit der Datenbank zu interagieren.
import contextlib
import csv
import datetime
import os
# https://github.com/PyMySQL/PyMySQL
import pymysql
SQL_QUERY = """
SELECT * FROM my_table WHERE my_attribute = 'my_attribute';
"""
# embedding passwords in code gets nasty when you use version control
# the environment is not much better, but this is an example
# https://stackoverflow.com/questions/12461484
SQL_USER = os.environ['SQL_USER']
SQL_PASS = os.environ['SQL_PASS']
connection = pymysql.connect(host='localhost',
user=SQL_USER,
password=SQL_PASS,
db='dbname')
with contextlib.closing(connection):
with connection.cursor() as cursor:
cursor.execute(SQL_QUERY)
# Hope you have enough memory :)
results = cursor.fetchall()
output_file = 'my_query-{}.csv'.format(datetime.datetime.today().strftime('%Y-%m-%d'))
with open(output_file, 'w', newline='') as csvfile:
# http://stackoverflow.com/a/17725590/2958070 about lineterminator
csv_writer = csv.writer(csvfile, lineterminator='\n')
csv_writer.writerows(results)
Alternativ zur Antwort oben können Sie eine MySQL-Tabelle, die das CSV-Engine verwendet.
Dann werden Sie eine Datei auf Ihrer Festplatte haben, die immer in einem CSV-Format sein werden, die Sie gerade ohne Verarbeitung kopieren könnten.
auf frühere Antworten zu erweitern, der folgende Einzeiler exportiert eine einzelne Tabelle als Tab-separierte Datei. Es ist geeignet für die Automatisierung, jeden Tag, um die Datenbank zu exportieren oder so.
mysql -B -D mydatabase -e 'select * from mytable'
Praktischerweise können wir die gleiche Technik zur Liste aus MySQL-Tabellen verwenden, und die Felder auf einer einzigen Tabelle zu beschreiben:
mysql -B -D mydatabase -e 'show tables'
mysql -B -D mydatabase -e 'desc users'
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
email varchar(128) NO UNI NULL
lastName varchar(100) YES NULL
title varchar(128) YES UNI NULL
userName varchar(128) YES UNI NULL
firstName varchar(100) YES NULL
Auch wenn Sie die Abfrage auf der Bash-Befehlszeile Leistung erbringt, glaube ich, der tr
Befehl verwendet werden kann, um den Standard Registerkarten beliebige Begrenzungszeichen zu ersetzen.
$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,
Aufbauend auf user7610, hier ist der beste Weg, es zu tun. Mit mysql outfile
gab es 60 Minuten von Dateibesitz und Überschreibungs Probleme.
Es ist nicht cool, aber es funktioniert in 5 Min.
php csvdump.php localhost root password database tablename > whatever-you-like.csv
<?php
$server = $argv[1];
$user = $argv[2];
$password = $argv[3];
$db = $argv[4];
$table = $argv[5];
mysql_connect($server, $user, $password) or die(mysql_error());
mysql_select_db($db) or die(mysql_error());
// fetch the data
$rows = mysql_query('SELECT * FROM ' . $table);
$rows || die(mysql_error());
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
// output the column headings
$fields = [];
for($i = 0; $i < mysql_num_fields($rows); $i++) {
$field_info = mysql_fetch_field($rows, $i);
$fields[] = $field_info->name;
}
fputcsv($output, $fields);
// loop over the rows, outputting them
while ($row = mysql_fetch_assoc($rows)) fputcsv($output, $row);
?>
Hier ist, was ich tun:
echo $QUERY | \
mysql -B $MYSQL_OPTS | \
perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F ' | \
mail -s 'report' person@address
Der Perl-Skript (von anderswo sniped) ist eine schöne Aufgabe, die Registerkarte Abstand Felder CSV konvertiert werden.
Nicht gerade als CSV-Format, aber tee
Befehl von MySQL Client kann verwendet werden, um die Ausgabe in eine lokal speichern Datei:
tee foobar.txt
SELECT foo FROM bar;
Sie können es deaktivieren notee
verwenden.
Das Problem mit SELECT … INTO OUTFILE …;
ist, dass es die Erlaubnis erfordert Dateien auf dem Server zu schreiben.
, um die Lösung von Tim geschrieben benutzen, habe ich diesen Bash-Skript, um den Prozess zu erleichtern (root-Passwort angefordert wird, aber Sie können das Skript leicht ändern für andere Benutzer zu fragen):
#!/bin/bash
if [ "$1" == "" ];then
echo "Usage: $0 DATABASE TABLE [MYSQL EXTRA COMMANDS]"
exit
fi
DBNAME=$1
TABLE=$2
FNAME=$1.$2.csv
MCOMM=$3
echo "MySQL password:"
stty -echo
read PASS
stty echo
mysql -uroot -p$PASS $MCOMM $DBNAME -B -e "SELECT * FROM $TABLE;" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > $FNAME
Es wird eine Datei mit Namen: database.table.csv
Wenn Sie PHP auf dem Server einrichten, können Sie mysql2csv ein Export (tatsächlich gültig) CSV-Datei für eine abitrary mysql query. Siehe meine Antwort auf MySQL - SELECT * INTO OUTFILE LOCAL für ein wenig mehr Kontext / Info
?. Ich habe versucht, die Option Namen von mysql
zu halten, so dass es ausreichend sein sollte, um die --file
und --query
Optionen zu bieten:
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"
"Installieren" mysql2csv
über
wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65 mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv
(Download-Inhalt des Wesentlichen, Prüfsumme überprüfen und ausführbar machen).
Was für mich gearbeitet:
SELECT *
FROM students
WHERE foo = 'bar'
LIMIT 0,1200000
INTO OUTFILE './students-1200000.csv'
FIELDS TERMINATED BY ',' ESCAPED BY '"'
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n';
Keine der Lösungen auf diesem Thread arbeitete für meinen speziellen Fall, ich in einen der Spalten ziemlich json Daten hatte, die in meinem csv-Ausgang bis bekommen messed würde. Für diejenigen mit einem ähnlichen Problem, versuchen Linien beendet durch \ r \ n statt.
Auch ein anderes Problem für diejenigen, die versuchen, die csv mit Microsoft Excel zu öffnen, bedenken Sie sich eine Grenze von 32.767 Zeichen ist, dass eine einzelne Zelle halten kann, vor, dass sie zu den Zeilen unterhalb überlaufen. Um festzustellen, welche in einer Spalte zeichnet das Problem haben, verwenden Sie die folgende Abfrage. Sie können dann die Datensätze gestutzt oder mit ihnen umgehen, wie Sie möchten.
SELECT id,name,CHAR_LENGTH(json_student_description) AS 'character length'
FROM students
WHERE CHAR_LENGTH(json_student_description)>32767;
Tiny Bash-Skript zu tun einfache Abfrage zu CSV-Dumps, inspiriert von https://stackoverflow.com/a/5395421/2841607 .
#!/bin/bash
# $1 = query to execute
# $2 = outfile
# $3 = mysql database name
# $4 = mysql username
if [ -z "$1" ]; then
echo "Query not given"
exit 1
fi
if [ -z "$2" ]; then
echo "Outfile not given"
exit 1
fi
MYSQL_DB=""
MYSQL_USER="root"
if [ ! -z "$3" ]; then
MYSQL_DB=$3
fi
if [ ! -z "$4" ]; then
MYSQL_USER=$4
fi
if [ -z "$MYSQL_DB" ]; then
echo "Database name not given"
exit 1
fi
if [ -z "$MYSQL_USER" ]; then
echo "Database user not given"
exit 1
fi
mysql -u $MYSQL_USER -p -D $MYSQL_DB -B -s -e "$1" | sed "s/'/\'/;s/\t/\",\"/g;s/^/\"/;s/$/\"/;s/\n//g" > $2
echo "Written to $2"
Versuchen Sie diesen Code ein:
SELECT 'Column1', 'Column2', 'Column3', 'Column4', 'Column5'
UNION ALL
SELECT column1, column2,
column3 , column4, column5 FROM demo
INTO OUTFILE '/tmp/demo.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Für weitere Informationen: http: //dev.mysql .com / doc / refman / 5.1 / de / select-into.html
Der folgende Bash-Skript für mich funktioniert. Er optional wird auch das Schema für die gewünschten Tabellen.
#!/bin/bash
#
# export mysql data to CSV
#https://stackoverflow.com/questions/356578/how-to-output-mysql-query-results-in-csv-format
#
#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'
red='\033[0;31m'
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'
#
# a colored message
# params:
# 1: l_color - the color of the message
# 2: l_msg - the message to display
#
color_msg() {
local l_color="$1"
local l_msg="$2"
echo -e "${l_color}$l_msg${endColor}"
}
#
# error
#
# show the given error message on stderr and exit
#
# params:
# 1: l_msg - the error message to display
#
error() {
local l_msg="$1"
# use ansi red for error
color_msg $red "Error:" 1>&2
color_msg $red "\t$l_msg" 1>&2
usage
}
#
# display usage
#
usage() {
echo "usage: $0 [-h|--help]" 1>&2
echo " -o | --output csvdirectory" 1>&2
echo " -d | --database database" 1>&2
echo " -t | --tables tables" 1>&2
echo " -p | --password password" 1>&2
echo " -u | --user user" 1>&2
echo " -hs | --host host" 1>&2
echo " -gs | --get-schema" 1>&2
echo "" 1>&2
echo " output: output csv directory to export mysql data into" 1>&2
echo "" 1>&2
echo " user: mysql user" 1>&2
echo " password: mysql password" 1>&2
echo "" 1>&2
echo " database: target database" 1>&2
echo " tables: tables to export" 1>&2
echo " host: host of target database" 1>&2
echo "" 1>&2
echo " -h|--help: show help" 1>&2
exit 1
}
#
# show help
#
help() {
echo "$0 Help" 1>&2
echo "===========" 1>&2
echo "$0 exports a csv file from a mysql database optionally limiting to a list of tables" 1>&2
echo " example: $0 --database=cms --user=scott --password=tiger --tables=person --output person.csv" 1>&2
echo "" 1>&2
usage
}
domysql() {
mysql --host $host -u$user --password=$password $database
}
getcolumns() {
local l_table="$1"
echo "describe $l_table" | domysql | cut -f1 | grep -v "Field" | grep -v "Warning" | paste -sd "," - 2>/dev/null
}
host="localhost"
mysqlfiles="/var/lib/mysql-files/"
# parse command line options
while true; do
#echo "option $1"
case "$1" in
# options without arguments
-h|--help) usage;;
-d|--database) database="$2" ; shift ;;
-t|--tables) tables="$2" ; shift ;;
-o|--output) csvoutput="$2" ; shift ;;
-u|--user) user="$2" ; shift ;;
-hs|--host) host="$2" ; shift ;;
-p|--password) password="$2" ; shift ;;
-gs|--get-schema) option="getschema";;
(--) shift; break;;
(-*) echo "$0: error - unrecognized option $1" 1>&2; usage;;
(*) break;;
esac
shift
done
# checks
if [ "$csvoutput" == "" ]
then
error "ouput csv directory not set"
fi
if [ "$database" == "" ]
then
error "mysql database not set"
fi
if [ "$user" == "" ]
then
error "mysql user not set"
fi
if [ "$password" == "" ]
then
error "mysql password not set"
fi
color_msg $blue "exporting tables of database $database"
if [ "$tables" = "" ]
then
tables=$(echo "show tables" | domysql)
fi
case $option in
getschema)
rm $csvoutput$database.schema
for table in $tables
do
color_msg $blue "getting schema for $table"
echo -n "$table:" >> $csvoutput$database.schema
getcolumns $table >> $csvoutput$database.schema
done
;;
*)
for table in $tables
do
color_msg $blue "exporting table $table"
cols=$(grep "$table:" $csvoutput$database.schema | cut -f2 -d:)
if [ "$cols" = "" ]
then
cols=$(getcolumns $table)
fi
ssh $host rm $mysqlfiles/$table.csv
cat <<EOF | mysql --host $host -u$user --password=$password $database
SELECT $cols FROM $table INTO OUTFILE '$mysqlfiles$table.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
EOF
scp $host:$mysqlfiles/$table.csv $csvoutput$table.csv.raw
(echo "$cols"; cat $csvoutput$table.csv.raw) > $csvoutput$table.csv
rm $csvoutput$table.csv.raw
done
;;
esac
Wenn PHP auf dem Rechner installiert ist, die Sie verwenden, können Sie einen PHP-Skript schreiben, das zu tun. Es erfordert die PHP-Installation hat die MySQL-Erweiterung installiert ist.
Sie können den PHP-Interpreter von der Kommandozeile aufrufen wie folgt:
php --php-ini path/to/php.ini your-script.php
Ich schließe den --php-ini
Schalter, da müssen Sie Ihre eigene PHP-Konfiguration verwenden, die die MySQL-Erweiterung ermöglicht. Auf PHP 5.3.0+, dass Erweiterung ist standardmäßig aktiviert, so dass nicht mehr notwendig ist, um die Konfiguration zu verwenden, um es zu aktivieren.
Dann können Sie Ihre Export-Skript wie jeder normale PHP-Skript schreiben:
<?php
#mysql_connect("localhost", "username", "password") or die(mysql_error());
mysql_select_db("mydb") or die(mysql_error());
$result = mysql_query("SELECT * FROM table_with_the_data p WHERE p.type = $typeiwant");
$result || die(mysql_error());
while($row = mysql_fetch_row($result)) {
$comma = false;
foreach ($row as $item) {
# Make it comma separated
if ($comma) {
echo ',';
} else {
$comma = true;
}
# Quote the quotes
$quoted = str_replace("\"", "\"\"", $item);
# Quote the string
echo "\"$quoted\"";
}
echo "\n";
}
?>
Der Vorteil dieser Methode ist, dass es keine Probleme mit varchar und Textfelder hat, die Text enthalten, Zeilenumbrüche haben. Diese Felder sind richtig zitiert und diese Zeilenumbrüche in ihnen werden von den CSV-Lesern als Teil des Textes, nicht Satztrenn interpretiert werden. Das ist etwas, das nur schwer zu korrigieren danach mit sed oder so.
In der folgenden erzeugt Tab-separierte und gültig CSV-Ausgabe. Im Gegensatz zu den meisten anderen Antworten, richtig diese Technik Griffe von Tabs zu entkommen, Kommas, Anführungszeichen und neue Linien ohne Stromfilter wie sed, awk oder tr. Das Beispiel zeigt, wie Rohr eine Remote-MySQL-Tabelle direkt in einem lokalen SQLite-Datenbank-Streams verwenden. Dies funktioniert ohne FILE Erlaubnis oder SELECT INTO OUTFILE Erlaubnis. Ich habe neue Linien zur besseren Lesbarkeit hinzugefügt.
mysql -B -C --raw -u 'username' --password='password' --host='hostname' 'databasename'
-e 'SELECT
CONCAT('\''"'\'',REPLACE(`id`,'\''"'\'', '\''""'\''),'\''"'\'') AS '\''id'\'',
CONCAT('\''"'\'',REPLACE(`value`,'\''"'\'', '\''""'\''),'\''"'\'') AS '\''value'\''
FROM sampledata'
2>/dev/null | sqlite3 -csv -separator $'\t' mydb.db '.import /dev/stdin mycsvtable'
Die 2>/dev/null
benötigt wird, um die Warnung über das Passwort auf der Kommandozeile zu unterdrücken.
Wenn Ihre Daten NULLs haben, können Sie die IFNULL () Funktion in der Abfrage verwenden.
Sie können unter Befehl von Ihrem SQL-Editor / Terminal verwenden:
" mysql -h (Hostname / IP>) -u (Benutzername) -p (Passwort) database <(query.sql)> output (.txt / .xls) "
z Hostname -x.x.x.x
uname - username
Passwort - Passwort
DBName - employeeDB
queryFile - employee.sql
output - outputFile.xls
mysql -hx.x.x.x -uusername Ppassword employeeDB
Stellen Sie sicher, dass Sie den Befehl aus dem Verzeichnis ausgeführt werden, wo SQL-Abfrage befindet, oder den vollständigen Pfad der SQL-Abfrage Lage in dem obigen Befehl erwähnen.