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.

War es hilfreich?

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.

  1. 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:

  1. Ersetzen " mit "" in jedem Feld -> replace(field1, '"', '""')
  2. Surround jedes Ergebnis in Anführungszeichen -> concat('"', result1, '"')
  3. 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 outputFile.xls

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top