كيفية إخراج الخلية نتائج الاستعلام في تنسيق CSV?
سؤال
هل هناك طريقة سهلة لتشغيل الاستعلام الخلية من سطر الأوامر لينكس و إخراج النتائج في 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، لكنني أفضل عدم القول بأن لهذا الغرض بسيط.
ونأمل شخص ما سوف نشير إلى أداة مناسبة، وهذا كان قليلا من الاختبار. وإلا لكنت على الارجح سوف تحديث هذا عندما أجد أو كتابة واحدة.
من سطر الأوامر ، يمكنك القيام بذلك:
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*
الاعتمادات: تصدير جدول من الأمازون RDS إلى ملف csv
والعديد من الإجابات على هذه الصفحة ضعيفة لأنها لا تتعامل مع قضية عامة عن ما يمكن أن يحدث في تنسيق 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 (ق).
ويمكن تحسين هذا للتعامل مع الملفات الكبيرة جدا عبر نهج الدفق.
- المنطق :
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;
التفسير:
- محل
"
مع""
في كل حقل -->replace(field1, '"', '""')
- تحيط كل نتيجة في علامات اقتباس -->
concat('"', result1, '"')
- وضع فاصلة بين كل نقلت النتيجة -->
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 الموقع في الأمر أعلاه.