كيفية إخراج الخلية نتائج الاستعلام في تنسيق CSV?

StackOverflow https://stackoverflow.com/questions/356578

  •  21-08-2019
  •  | 
  •  

سؤال

هل هناك طريقة سهلة لتشغيل الاستعلام الخلية من سطر الأوامر لينكس و إخراج النتائج في CSV تنسيق ؟

هنا هو ما أفعله الآن:

mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/        /,/g' | tee list.csv
select id, concat("\"",name,"\"") as name
from students
EOQ

فإنه يحصل فوضوي عندما يكون هناك الكثير من الأعمدة التي تحتاج إلى أن تكون محاطة يقتبس, أو إذا كانت هناك علامات الاقتباس في النتائج التي تحتاج إلى أن هرب.

هل كانت مفيدة؟

المحلول

من <لأ href = "http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/" يختلط = "noreferrer "> http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/

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';

وباستخدام هذه الأعمدة القيادة لن يتم تصدير الأسماء.

لاحظ أيضا أن ذلك /var/lib/mysql-files/orders.csv يكون على الخلية <م> الخادم يعمل بنظام التشغيل. المستخدم أن عملية الخلية يعمل ضمن يجب أن يكون لديك أذونات الكتابة إلى الدليل المختار، وإلا سيفشل الأمر.

إذا كنت تريد أن تكتب الإخراج إلى الجهاز المحلي من الملقم البعيد (خصوصا استضافت أو المحاكاة الافتراضية الجهاز مثل Heroku أو الأمازون RDS)، هذا الحل غير مناسب.

نصائح أخرى

$ mysql your_database --password=foo < my_requests.sql > out.csv

ما هو التبويب فصل. الأنابيب من هذا القبيل للحصول على CSV صحيح (بفضلtherefromhere):

... .sql | sed 's/\t/,/g' > out.csv
<اقتباس فقرة>   

والخلية --batch، -B

     

والنتائج الطباعة باستخدام علامة التبويب كفاصل العمود، مع كل صف على   خط جديد. مع هذا الخيار، الخلية لا يستخدم ملف التاريخ.   النتائج دفعة واسطة في تنسيق الإخراج غير جدولي والهروب من   الأحرف الخاصة. الهروب قد يتم تعطيل باستخدام وضع الخام. نرى   وصف لخيار --raw.

وهذا سوف يعطيك ملف التبويب فصل. منذ لا يتم نجا الفواصل (أو السلاسل التي تحتوي فاصلة) أنها ليست واضحة لتغيير محدد لفاصلة.

هنا هو إلى حد ما نرلي طريقة للقيام بذلك.وجدت في مكان ما, لا يمكن اتخاذ أي الائتمان

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

يعمل بشكل جيد جدا.مرة أخرى على الرغم من regex يثبت كتابة فقط.


Regex التفسير:

  • s/// يعني محل ما بين الأول // ما بين الثانية //
  • "ز" وفي النهاية هو التعديل الذي يعني "كل سبيل المثال ، ليس فقط الأولى"
  • ^ (في هذا السياق) يعني بداية الخط
  • $ (في هذا السياق) يعني نهاية السطر

لذا وضع كل ذلك معا:

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

ويونيكس / سيغوين فقط، والأنابيب من خلال 'آر':

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

وN.B: هذا يتعامل مع الفواصل لا جزءا لا يتجزأ، ولا علامات التبويب المضمنة.

هذا انقذني عدة مرات.سريع و يعمل!

--دفعة نتائج الطباعة باستخدام علامة التبويب مثل عمود فاصل مع كل صف على خط جديد.

--الخام تعطيل حرف الهروب ( \0،\)

على سبيل المثال:

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

للتأكد من اكتمالها يمكن أن تحويل إلى csv (ولكن كن حذرا لأن علامات التبويب يمكن أن يكون داخل مجال القيم - على سبيل المثال ، حقول النص)

tr '\t' ',' < file.tsv > file.csv

والحل OUTFILE التي قدمها بول Tomblin يسبب ملف لتكون مكتوبة على الخلية الخادم نفسه، ولذلك فإن هذا سوف يعمل فقط إذا كان لديك <لأ href = "http://dev.mysql.com/doc/refman/5.0 /en/privileges-provided.html#priv_file "يختلط =" noreferrer "> وصول FILE ، فضلا عن الوصول لتسجيل الدخول أو وسائل أخرى لاسترداد الملف من هذا المربع.

إذا لم يكن لديك مثل هذا الوصول، والإخراج المفصول هو بديل معقول لCSV (على سبيل المثال، إذا الهدف النهائي هو لاستيراد إلى Excel)، ثم حل Serbaut في (باستخدام mysql --batch و--raw اختياريا) هو الطريق للذهاب.

ماي طاولة العمل يمكن تصدير السجلات إلى CSV، ويبدو أن التعامل مع الفواصل في حقول جدا حسنا. وCSV يفتح في أوبن أوفيس غرامة.

وماذا عن:

mysql your_database -p < my_requests.sql | awk '{print $1","$2}' > out.csv

وجميع الحلول هنا حتى الآن، باستثناء الخلية منضدة واحدة، غير صحيحة وغير آمنة من المحتمل جدا (أي قضايا أمنية) لبعض المحتويات من الممكن على الأقل في ديسيبل ماي.

وMYSQL طاولة العمل (وبالمثل بريس) توفر الحل الصحيح رسميا، ولكنها مصممة لتحميل الإخراج إلى مكان وجود المستخدم. انهم ليسوا مفيدة جدا لأشياء مثل أتمتة تصدير البيانات.

وليس من الممكن لتوليد CSV الصحيح موثوق من إخراج mysql -B -e 'SELECT ...' لأن ذلك لا يمكن ترميز الإرجاع والمساحة البيضاء في الحقول. علم "-s" إلى الخلية يفعل مائل الهروب، وربما يؤدي إلى الحل الصحيح. ومع ذلك، باستخدام لغة البرمجة (واحد مع الهياكل لائقة الداخلية البيانات التي هو، وليس باش)، والمكتبات حيث كانت القضايا ترميز بالفعل وضعت بعناية أكثر أمانا بكثير.

وفكرت في كتابة سيناريو لهذا، ولكن بمجرد أن فكرت في ما يمكن أن يطلق عليه، أنها وقعت لي للبحث عن عمل موجودة مسبقا التي تحمل نفس الاسم. ورغم أنني لم أذهب أكثر من ذلك تماما، فإن الحل في https://github.com/robmiller/mysql2csv تبدو واعدة. اعتمادا على التطبيق الخاص بك، ونهج YAML لتحديد الأوامر SQL قد تكون أو لا يروق بالرغم من ذلك. أنا أيضا لا الإثارة مع شرط للحصول على إصدار أحدث من روبي من يأتي بشكل قياسي مع بلدي أوبونتو 12.04 الكمبيوتر المحمول أو خوادم الضغط ديبيان. نعم أنا أعلم أنني يمكن أن تستخدم RVM، لكنني أفضل عدم القول بأن لهذا الغرض بسيط.

ونأمل شخص ما سوف نشير إلى أداة مناسبة، وهذا كان قليلا من الاختبار. وإلا لكنت على الارجح سوف تحديث هذا عندما أجد أو كتابة واحدة.

والعديد من الإجابات على هذه الصفحة ضعيفة لأنها لا تتعامل مع قضية عامة عن ما يمكن أن يحدث في تنسيق CSV. مثلا الفواصل ونقلت جزءا لا يتجزأ من الحقول وغيرها من الشروط التي تأتي دائما في نهاية المطاف. نحن بحاجة إلى حل عام أن يعمل لجميع البيانات المدخلة CSV صالح.

وهنا حل بسيط وقوي في بيثون:

#!/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)

والاسم الذي tab2csv ملف، ووضعها على المسار الخاص بك، وإعطائها تنفيذ الأذونات، ثم استخدامها مثل هذا:

mysql OTHER_OPTIONS --batch --execute='select * from whatever;' | tab2csv > outfile.csv

ووبيثون CSV للمناولة وظائف تغطي الحالات الزاوية لتنسيق المدخلات CSV (ق).

ويمكن تحسين هذا للتعامل مع الملفات الكبيرة جدا عبر نهج الدفق.

  1. المنطق :

CREATE TABLE () (SELECT data FROM other_table ) ENGINE=CSV ;

عند إنشاء ملف CSV الجدول الملقم بإنشاء جدول تنسيق الملف في قاعدة بيانات الدليل.يبدأ الملف مع اسم الجدول و .frm التمديد.مشغل التخزين أيضا بإنشاء ملف بيانات.اسمها يبدأ مع اسم الجدول و لديه .CSV التمديد.ملف البيانات ملف نصي عادي.عند تخزين البيانات في الجدول التخزين محرك يحفظ في ملف البيانات في قيم مفصولة بفواصل الشكل.

هذا هو بسيط و هو يعمل على أي شيء دون الحاجة إلى دفعة واسطة أو ملفات الإخراج:

select concat_ws(',',
    concat('"', replace(field1, '"', '""'), '"'),
    concat('"', replace(field2, '"', '""'), '"'),
    concat('"', replace(field3, '"', '""'), '"'))

from your_table where etc;

التفسير:

  1. محل " مع "" في كل حقل --> replace(field1, '"', '""')
  2. تحيط كل نتيجة في علامات اقتباس --> concat('"', result1, '"')
  3. وضع فاصلة بين كل نقلت النتيجة --> concat_ws(',', quoted1, quoted2, ...)

هذا هو!

وهذه الإجابة يستخدم بيثون ومكتبة طرف ثالث الشعبية، PyMySQL . أنا إضافته ل CSV مكتبة قوية بما فيه الكفاية ل<م> صحيح التعامل مع العديد من النكهات المختلفة من .csv ولا إجابات أخرى تستخدم كود بايثون للتفاعل مع قاعدة البيانات.

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)

وبدلا من ذلك إلى الإجابة أعلاه، يمكن أن يكون هناك جدول الخلية يستخدم محرك CSV.

وبعد ذلك سيكون لديك ملف على القرص الثابت الخاص بك من شأنها أن تكون دائما في شكل CSV الذي يمكن نسخ فقط دون معالجتها.

لتوسيع في الأجوبة السابقة، وبطانة واحدة بعد تصدر جدول واحد كملف مفصول. انها مناسبة لأتمتة وتصدير قاعدة البيانات كل يوم أو نحو ذلك.

mysql -B -D mydatabase -e 'select * from mytable'

ومريح، يمكننا استخدام نفس الأسلوب لقائمة من الجداول ماي، وووصف الحقول في جدول واحد:

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    

وأيضا، إذا كنت أداء الاستعلام على سطر الأوامر باش، وأعتقد أن القيادة tr يمكن استخدامها لاستبدال علامات التبويب الافتراضية إلى المحددات التعسفية.

و$ echo "SELECT * FROM Table123" | mysql Database456 | tr "\t" ,

وبناء على user7610، وهنا هو أفضل طريقة للقيام بذلك. مع mysql outfile كان هناك 60 دقيقة من ملكية الملف ومشاكل الكتابة.

وانها ليست باردة، لكنها عملت في 5 دقائق.

و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);

?>

وهنا هو ما أقوم به:

echo $QUERY | \
  mysql -B  $MYSQL_OPTS | \
  perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F ' | \
  mail -s 'report' person@address

ووالمخطوطة (مقنوص من مكان آخر) يقوم بعمل لطيفة من تحويل حقول متباعدة Tab للCSV.

ليس بالضبط كما تنسيق CSV ، ولكن tee الأمر من الخلية العميل يمكن استخدامها لحفظ الانتاج في المحلية ملف:

tee foobar.txt
SELECT foo FROM bar;

يمكنك تعطيل ذلك باستخدام notee.

المشكلة SELECT … INTO OUTFILE …; هو أنه يتطلب إذن كتابة الملفات على الخادم.

استخدام الحل أرسلت بواسطة تيم, أنا خلقت هذا باش سكربت لتسهيل عملية (root كلمة المرور المطلوبة ، ولكن يمكنك تعديل البرنامج النصي بسهولة أن نسأل عن أي مستخدم آخر):

#!/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

فإنه سيتم إنشاء ملف اسمه: قاعدة البيانات.الجدول.csv

إذا كان لديك PHP على الخادم ، يمكنك استخدام mysql2csv تصدير (في الواقع صالحة) ملف CSV على abitrary mysql query.انظر جوابي في MySQL - SELECT * INTO OUTFILE المحلية ؟ للمزيد من السياق/معلومات عن الفندق.

حاولت الحفاظ على خيار أسماء من mysql لذلك ينبغي أن تكون كافية لتوفير --file و --query الخيارات:

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

"تثبيت" mysql2csv عبر

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

(تنزيل المحتوى المطلوب التحقق من المجموع الاختباري وجعلها قابلة للتنفيذ).

وماذا عملت لي:

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';

وأي من الحلول في هذا الموضوع عمل لحالتي خاصة، وكان لي البيانات JSON جدا داخل أحد الأعمدة، التي من شأنها أن الحصول على افسدت في الناتج CSV بلدي. لأولئك الذين يعانون من مشكلة مماثلة، في محاولة خطوط إنهاؤها من قبل \ ص \ ن بدلا من ذلك.

وأيضا مشكلة أخرى لأولئك الذين يحاولون فتح CSV مع Microsoft Excel، نضع في اعتبارنا أن هناك حدودا من 32،767 الأحرف التي خلية واحدة يمكن أن تعقد، فوق أنه يفيض إلى الصفوف أدناه. لتحديد الذي يسجل في عمود لديك المشكلة، استخدم الاستعلام أدناه. يمكنك بعد ذلك اقتطاع تلك السجلات أو التعامل معها بقدر ما تريد.

SELECT id,name,CHAR_LENGTH(json_student_description) AS 'character length'
FROM students
WHERE CHAR_LENGTH(json_student_description)>32767;

صغيرة باش سكربت لعمل استعلام بسيط إلى CSV مقالب, مستوحاة من 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"

وحاول هذا الرمز:

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';

لمزيد من المعلومات: HTTP: //dev.mysql كوم / وثيقة / RefMan معلومات / 5.1 / EN / حدد-into.html

والسيناريو باش التالية يعمل بالنسبة لي. ذلك اختياريا أيضا يحصل على مخطط الجداول المطلوبة.

#!/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

إذا كان هناك PHP المثبتة على الجهاز الذي تستخدمه، يمكنك كتابة السيناريو PHP للقيام بذلك. فإنه يتطلب تركيب PHP وتمديد الخلية تثبيت.

ويمكنك استدعاء مترجم PHP من سطر الأوامر كما يلي:

php --php-ini path/to/php.ini your-script.php

وأنا بما في ذلك التبديل --php-ini، لأنك قد تحتاج إلى استخدام التكوين PHP الخاصة التي تمكن من توسيع الخلية. على PHP 5.3.0+ تم تمكين هذا التمديد افتراضيا، بحيث لم يعد من الضروري استخدام التكوين لتمكينه.

وبعد ذلك يمكنك كتابة السيناريو التصدير مثل أي برنامج نصي PHP العادي:

<?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";
    }
?>

وميزة هذه الطريقة، وأنه لا يوجد لديه مشاكل مع varchar وحقول النص، التي لديها نصي يحتوي على أسطر جديدة. ونقلت بشكل صحيح تلك الحقول وسيتم تفسير تلك أسطر جديدة في نفوسهم من قبل القارئ CSV كجزء من النص، وليس فصل قياسية. هذا أمر يصعب تصحيح بعد ذلك مع ااا أو نحو ذلك.

التالية تنتج المفصول المفعول CSV الناتج.على عكس معظم إجابات أخرى, هذه التقنية بشكل صحيح يعالج الهروب من علامات التبويب, الفواصل, ونقلت و خطوط جديدة دون أي تيار تصفية مثل sed, awk ، أو tr.يعرض المثال التالي كيفية الأنابيب البعيدة الجدول الخلية مباشرة في قاعدة بيانات sqlite المحلية باستخدام تيارات.يعمل هذا الملف دون إذن أو SELECT INTO OUTFILE إذن.لقد تم إضافة خطوط جديدة لهذين.

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'

على 2>/dev/null هناك حاجة إلى قمع تحذير عن كلمة في سطر الأوامر.

إذا كانت البيانات الخاصة بك قد بالقيم الخالية ، يمكنك استخدام IFNULL() وظيفة في الاستعلام.

يمكنك استخدام الأمر أدناه من محرر SQL/المحطة الطرفية:

"الخلية -ح(اسم المضيف/IP>) -u(اسم المستخدم) -p(كلمة المرور) databasename <(الاستعلام.sql) > outputFILE(.txt/.xls)"

هـ.ز اسم المضيف-x.x.x.x

uname - اسم المستخدم

كلمة المرور - كلمة المرور

DBName - employeeDB

queryFile الموظف.sql

outputFile - outputFile.xls

الخلية -hx.x.x.x-uusername -ppassword employeeDB< الموظف.sql> outputFile.xls

تأكد من أن يتم تنفيذ الأمر من الدليل الذي استعلام SQL يقع أو ذكر المسار الكامل استعلام sql الموقع في الأمر أعلاه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top