จะแสดงผลลัพธ์คิวรี MySQL ในรูปแบบ CSV ได้อย่างไร


1183

มีวิธีที่ง่ายในการเรียกใช้แบบสอบถาม MySQL จากบรรทัดคำสั่ง Linux และส่งออกผลลัพธ์ในรูปแบบCSVหรือไม่

นี่คือสิ่งที่ฉันทำตอนนี้:

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

มันจะเกิดความยุ่งเหยิงเมื่อมีคอลัมน์จำนวนมากที่ต้องล้อมรอบด้วยเครื่องหมายคำพูดหรือหากมีเครื่องหมายคำพูดในผลลัพธ์ที่ต้องหลีกหนี


1
คุณสามารถใช้REPLACE()ในแบบสอบถามของคุณเพื่อให้คำพูดหลุดออกมาได้
dsm

ดูคำตอบของฉันใน [this stackoverflow] [1] [1]: stackoverflow.com/questions/12242772/ …
biniam

คุณสามารถจัดรูปแบบข้อมูลตารางเป็นตารางข้อความ
Somnath Muluk

2
คำตอบที่ได้รับการยอมรับสำหรับคำถามเกี่ยวกับส
แต็

ฉันเขียนคำขอคุณลักษณะในตัวติดตามบั๊ก MariaDB ( jira.mariadb.org/browse/MDEV-12879 ) คุณสามารถลงคะแนนได้
Jared Beck

คำตอบ:


1760

จาก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จะอยู่บนเซิร์ฟเวอร์ที่ใช้งาน MySQL ผู้ใช้ที่กระบวนการ MySQL กำลังทำงานอยู่จะต้องมีสิทธิ์ในการเขียนไปยังไดเรกทอรีที่เลือกไม่เช่นนั้นคำสั่งจะล้มเหลว

หากคุณต้องการที่จะเขียนผลลัพธ์ไปยังเครื่องท้องถิ่นของคุณจากเซิร์ฟเวอร์ระยะไกล (โดยเฉพาะอย่างยิ่งเครื่องที่โฮสต์หรือจำลองเสมือนเช่น Heroku หรือ Amazon RDS) โซลูชั่นนี้ไม่เหมาะ


16
@ Tomas ถ้าคุณสามารถเข้าถึงระบบไฟล์ระยะไกลและ MySQL คุณต้องสามารถเขียนได้ที่ไหน แทน / tmp ให้ลอง /home/yourusername/file.csv - หากล้มเหลวและชุดผลลัพธ์มีขนาดไม่ใหญ่คุณสามารถคัดลอกผลลัพธ์จากไคลเอนต์ SSH ของคุณและวางลงในเครื่องท้องถิ่นของคุณ
Michael Butler

63
คำถามที่ระบุ MySQL ไม่ใช่ "เป็นไปตามมาตรฐาน"
พอลทอมบลิน

35
วิธีรวมส่วนหัวด้วย?
Bogdan Gusiev

66
@BogdanGusiev คุณสามารถรวมส่วนหัวได้โดยใส่คำสั่ง "SELECT 'order_id', 'product_name', 'qty' UNION" ก่อนการสืบค้นจริง เลือกคิวรีแรกส่งคืนส่วนหัวแบบสอบถามที่สองส่งคืนข้อมูลจริง ยูเนี่ยนเข้าร่วมด้วยกัน
petrkotek

19
@Michael Butler: เอ่อไม่จริง หากคุณใช้ Amazon RDS, Heroku หรือโซลูชันโฮสต์อื่น ๆ คุณไม่น่าจะสามารถเขียนถึงเซิร์ฟเวอร์ของผู้อื่นได้
Ken Kinder

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

อันไหนแยกแท็บ ไปป์แบบนั้นเพื่อรับ CSV จริง (ขอบคุณ @therefromhere):

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

5
ไม่เพียงเท่านั้น แต่ยังอนุญาตให้สร้างเนื้อหาจากโฮสต์ฐานข้อมูลระยะไกลซึ่งแตกต่างจากการเขียนไปยังระบบไฟล์โลคัล
tmarthal

31
มันคั่นด้วยแท็บไม่ใช่คั่นด้วยเครื่องหมายจุลภาค
Flimm

13
@Flimm สมมติว่าคุณไม่มีเครื่องหมายจุลภาค / แท็บฝังอยู่ในฟิลด์ที่คุณสามารถแปลงได้โดยการวางผลลัพธ์ลงใน| sed 's/\t/,/g'
John Carter

111
sed 'fix' ไม่ชดเชยคอมม่าที่อาจปรากฏในข้อมูลใด ๆ ที่เลือกและจะทำให้คอลัมน์ของคุณเอียงตามลำดับ
Joey T

14
ปฏิเสธที่ถูกต้อง .. มันอาจจะทำงานสำหรับคุณ แต่ตอนนี้มันอาจกัดคุณในอนาคตเมื่อข้อมูลของคุณรวมถึงแท็บหรือเครื่องหมายจุลภาค ฯลฯ ..
จอห์นฮันท์

204

mysql - รุ่น, -B

พิมพ์ผลลัพธ์โดยใช้แท็บเป็นตัวคั่นคอลัมน์โดยแต่ละแถวในบรรทัดใหม่ ด้วยตัวเลือกนี้ mysql จะไม่ใช้ไฟล์ประวัติ ผลลัพธ์ของโหมดแบตช์ในรูปแบบเอาต์พุตแบบไม่มีตารางและการหลีกเลี่ยงอักขระพิเศษ การหลบหนีอาจถูกปิดใช้งานโดยใช้โหมดดิบ ดูคำอธิบายสำหรับตัวเลือก --raw

สิ่งนี้จะทำให้คุณมีแท็บแยกไฟล์ เนื่องจากเครื่องหมายจุลภาค (หรือสตริงที่มีเครื่องหมายจุลภาค) จะไม่หนีจึงไม่ตรงไปตรงมาเพื่อเปลี่ยนตัวคั่นเป็นเครื่องหมายจุลภาค


12
นี่เป็นวิธีแก้ปัญหาที่แนะนำ: 1) รายการที่คั่นด้วยแท็บเป็นเรื่องปกติใน UNIX 2) การนำเข้า TSV นั้นได้รับการสนับสนุนโดยระบบการนำเข้าส่วนใหญ่เช่น Excel, OpenOffice Spreadsheets เป็นต้น 3) ไม่จำเป็นต้องหลีกเลี่ยงอักขระเครื่องหมายคำพูดสำหรับฟิลด์ข้อความ 4 ) ทำให้การส่งออกบรรทัดคำสั่งเป็นเรื่องง่าย
Joey T

5
นี่เป็นทางออกที่ดีที่สุดเพราะไม่เหมือนครั้งแรกที่ไม่จำเป็นต้องได้รับอนุญาตบนเซิร์ฟเวอร์เช่น RDS
Muayyad Alsadi

8
เคล็ดลับเรียบร้อย: หากคุณบันทึกไฟล์แยกแท็บเป็น. xls แทนที่จะเป็น. csv มันจะเปิดใน excel โดยไม่จำเป็นต้องมีการแปลง "text to data" และไม่มีปัญหาการตั้งค่าภูมิภาค
serbaut

3
@Joey T - คุณยังคงต้องหนีจากแท็บและการขึ้นบรรทัดใหม่ นอกจากนี้หากเนื้อหาของเขตข้อมูลดูเหมือนกับเขตข้อมูลที่ยกมาหรือหนีไปแล้วเนื้อหาที่นำเข้าอาจไม่เหมือนต้นฉบับ
mc0e

2
คุณจะมีปัญหากับ NULLs .. พวกเขาจะออกมาเป็นสตริงโมฆะ ..
โจนาธาน

141

นี่เป็นวิธีที่ค่อนข้างปมในการทำ พบที่ใดที่หนึ่งไม่สามารถใช้เครดิตได้

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 /// หมายถึงทดแทนสิ่งที่อยู่ระหว่างตัวแรก // กับสิ่งที่อยู่ระหว่างตัวที่สอง //
  • "g" ในตอนท้ายคือตัวดัดแปลงที่หมายถึง "อินสแตนซ์ทั้งหมดไม่ใช่แค่ก่อน"
  • ^ (ในบริบทนี้) หมายถึงจุดเริ่มต้นของบรรทัด
  • $ (ในบริบทนี้) หมายถึงจุดสิ้นสุดของบรรทัด

ดังนั้นใส่ทั้งหมดเข้าด้วยกัน:

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

3
ธง -e เป็นสิ่งที่ฉันกำลังมองหา! ขอบคุณ!
Gaurav Gupta

1
regex นี้ค่อนข้างง่ายจริงๆ ชอบมากของคำตอบอื่น ๆ mysql -Bบนหน้านี้เพียงแค่ทำความสะอาดเอาท์พุทจาก ถ้าคุณแยก regex ออกเป็นข้อความเดี่ยว ๆ ในแต่ละบรรทัดมันจะค่อนข้างง่าย (สำหรับคนที่รู้จัก regex) เพื่อทำความเข้าใจ
เม.ย.

7
ในการเหลียวมองครั้งแรกมันดูค่อนข้างหัก แท็บและการขึ้นบรรทัดใหม่ในเนื้อหาจะผิดพลาด "s / '/ \' /;" ไม่ทำอะไรเลยเพราะเครื่องหมายคำพูดคู่ในคำสั่งเชลล์ใช้แบ็กสแลช ข้อบกพร่องที่คล้ายกันอื่น ๆ อีกมากมายที่มีแบ็กสแลชหายไป ไม่มีการจัดการแบ็กสแลชในฟิลด์ db
mc0e

1
ดูเหมือนว่าคำสั่งนี้จะทำงานได้ดีบน Linux แต่ไม่ใช่ใน Mac
Hemerson Varela

6
สิ่งนี้จะแตกถ้าคุณมีช่องข้อความที่มีแท็บแบ็กสแลช","และอีกหลายอย่าง Regex ไม่ใช่วิธีการแก้ปัญหานี้
Aidan

93

Unix / Cygwinเท่านั้น, ไพพ์ผ่าน 'tr':

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

หมายเหตุ: สิ่งนี้จะจัดการกับเครื่องหมายจุลภาคที่ฝังตัวหรือแท็บที่ฝังตัว


53

สิ่งนี้ช่วยฉันสองสามครั้ง เร็วและใช้งานได้!

- แบทช์ ผลการพิมพ์โดยใช้แท็บเป็นตัวคั่นคอลัมน์โดยแต่ละแถวในบรรทัดใหม่

- วาด ปิดการใช้งานการหลบหนีอักขระ (\ n, \ t, \ 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


4
เว้นแต่ฉันจะทำบางสิ่งบางอย่างสิ่งนี้จะสร้างไฟล์ TSV ไม่ใช่ไฟล์ CSV ...
กด

@PressingOnAlways ใช่ MySQL doc quote: "พิมพ์ผลลัพธ์โดยใช้แท็บเป็นตัวคั่นคอลัมน์โดยแต่ละแถวในบรรทัดใหม่" แต่การแยกวิเคราะห์ไม่ควรมีปัญหากับตัวคั่นใด ๆ ฉันใช้มันเพื่อสร้างไฟล์ excel สำหรับลูกค้าของฉัน
hrvoj3e

39

โซลูชัน OUTFILE ที่กำหนดโดย Paul Tomblin ทำให้ไฟล์ถูกเขียนบนเซิร์ฟเวอร์ MySQL เองดังนั้นวิธีนี้จะใช้ได้เฉพาะเมื่อคุณมีการเข้าถึงไฟล์รวมถึงการเข้าสู่ระบบหรือวิธีการอื่นในการดึงไฟล์จากกล่องนั้น

หากคุณไม่มีสิทธิ์เข้าถึงดังกล่าวและเอาต์พุตที่คั่นด้วยแท็บเป็นสิ่งทดแทนที่เหมาะสมสำหรับ CSV (เช่นหากเป้าหมายสุดท้ายของคุณคือการนำเข้าสู่ Excel) แสดงว่าโซลูชันของ Serbaut (การใช้mysql --batchและเป็นทางเลือก--raw) เป็นวิธีที่จะไป


36

MySQL Workbenchสามารถส่งออกชุดระเบียนเป็น CSV และดูเหมือนว่าจะจัดการกับเครื่องหมายจุลภาคในฟิลด์ได้เป็นอย่างดี CSV เปิดขึ้นใน OpenOffice อย่างดี


2
ขอบคุณหนึ่งล้านดาวิด หลังจากใช้เวลา 3 ชั่วโมงในการรับบรรทัดใหม่เพื่อส่งออกอย่างถูกต้องสำหรับเนื้อหา HTML ในข้อมูลฉันใช้ MySQL Workbench และภายใน 2 นาทีฉันก็เตรียมไฟล์ CSV ของฉัน
mr-euro

ฉันเพิ่งพบว่ามันสามารถบันทึกเป็น XML ได้เช่นกันซึ่งยอดเยี่ยม ฉันหวังว่าจะย้ายจากแอปพลิเคชันหนึ่งไปยังอีกแอปหนึ่งโดยใช้ XSLT เพื่อแปลง XML นี้เป็นไฟล์ CSV ที่เหมาะสำหรับการนำเข้าสู่แอปพลิเคชันเป้าหมาย
เดวิดโอลิเวอร์

ปรับแต่ง mysql เป็นตัวเลือกที่ดีที่สุดสำหรับการนำเข้าคุณสมบัติการส่งออก
cijagani

1
ฉันเพิ่งส่งออกไปกว่าครึ่งล้านแถวโดยใช้ mysql workbench เรียบร้อยแล้วไฟล์ขนาดใหญ่ดูเหมือนจะไม่เป็นปัญหา คุณต้องตรวจสอบให้แน่ใจว่าคุณได้ลบขีด จำกัด การเลือกก่อนเรียกใช้คิวรีของคุณและคุณอาจต้องเพิ่มค่าต่อไปนี้ในไฟล์ my.ini ของคุณ: max_allowed_packet = 500M, net_read_timeout = 600, net_write_timeout = 600
Vincent

3
เวิร์กชีท MySQL มีการรั่วไหลของหน่วยความจำที่น่าอับอายเมื่อส่งออกข้อมูลใน CSV หากคุณมีชุดข้อมูลขนาดใหญ่เช่น 1 หรือ 2 ล้านแถว, 12 GB of RAM (ทดสอบบนเครื่อง linux ของฉัน) ไม่เพียงพอและหน่วยความจำจะไม่ถูกหักล้าง ฆ่าหรือหยุดมัน สำหรับชุดข้อมูลขนาดใหญ่นี่ไม่ใช่วิธีแก้ปัญหา
Ostico

33

เกี่ยวกับ:

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

2
ฉันชอบอันนี้มาก มันสะอาดกว่ามากและฉันชอบการใช้ awk อย่างไรก็ตามฉันอาจจะไปกับสิ่งนี้: mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
จอช

7
สิ่งนี้ล้มเหลวสำหรับค่าฟิลด์ที่มีช่องว่าง
Barun Sharma

29

โซลูชันทั้งหมดที่นี่จนถึงปัจจุบันยกเว้น MySQL workbench one นั้นไม่ถูกต้องและอาจไม่ปลอดภัย (เช่นปัญหาด้านความปลอดภัย) สำหรับเนื้อหาที่เป็นไปได้อย่างน้อยใน mysql db

MYSQL Workbench (และ PHPMyAdmin ในทำนองเดียวกัน) มอบโซลูชันที่ถูกต้องอย่างเป็นทางการ แต่ได้รับการออกแบบมาสำหรับการดาวน์โหลดเอาต์พุตไปยังตำแหน่งของผู้ใช้ มันไม่มีประโยชน์สำหรับสิ่งต่าง ๆ เช่นการส่งออกข้อมูลโดยอัตโนมัติ

ไม่สามารถสร้าง csv ที่ถูกต้องได้อย่างน่าเชื่อถือจากเอาต์พุตของ mysql -B -e 'SELECT ...'เนื่องจากไม่สามารถเข้ารหัสการขึ้นบรรทัดใหม่และ white space ในฟิลด์ การตั้งค่าสถานะ '-s' ไปยัง mysql จะทำการ backslash escaping และอาจนำไปสู่การแก้ไขที่ถูกต้อง อย่างไรก็ตามการใช้ภาษาสคริปต์ (หนึ่งที่มีโครงสร้างข้อมูลภายในที่ดีนั่นคือไม่ทุบตี) และห้องสมุดที่ปัญหาการเข้ารหัสได้ทำงานออกมาอย่างระมัดระวังนั้นปลอดภัยกว่า

ฉันคิดเกี่ยวกับการเขียนสคริปต์สำหรับสิ่งนี้ แต่ทันทีที่ฉันคิดเกี่ยวกับสิ่งที่ฉันเรียกมันมันเกิดขึ้นกับฉันเพื่อค้นหางานที่มีอยู่ก่อนด้วยชื่อเดียวกัน ในขณะที่ฉันยังไม่ได้ผ่านไปอย่างทั่วถึงโซลูชั่นที่https://github.com/robmiller/mysql2csvดูมีแนวโน้ม วิธี yaml ในการระบุคำสั่ง SQL อาจขึ้นอยู่กับแอพพลิเคชั่นของคุณ ฉันยังไม่ได้ตื่นเต้นกับความต้องการทับทิมรุ่นใหม่ ๆ มากกว่าที่เคยเป็นตามมาตรฐานกับแล็ปท็อป Ubuntu 12.04 หรือเซิร์ฟเวอร์ Debian Squeeze ของฉัน ใช่ฉันรู้ว่าฉันสามารถใช้ RVM ได้ แต่ฉันก็ไม่ควรทำเช่นนั้นเพื่อจุดประสงค์ง่ายๆ

หวังว่าใครบางคนจะชี้ให้เห็นเครื่องมือที่เหมาะสมนั่นคือการทดสอบเล็กน้อย มิฉะนั้นฉันจะอัปเดตเมื่อฉันพบหรือเขียนหนึ่ง


1
คุณพูดถูกสำหรับสตริงที่ซับซ้อนในตารางคุณต้องใช้ไลบรารี่ที่เหมาะสมไม่ใช่แค่ทุบตี ฉันคิดว่า nodejs มีวิธีแก้ปัญหาที่ดีกว่าสำหรับการกระทำประเภทนี้ เช่นตัวอย่าง
yeya

1
สวัสดีคำตอบที่ดีฉันจะเพิ่มลิงก์ไปยังโซลูชัน python ที่เสนอด้านล่างstackoverflow.com/a/35123787/1504300ซึ่งทำงานได้ดีและใช้งานง่ายมาก ฉันพยายามแก้ไขโพสต์ของคุณ แต่การแก้ไขนั้นถูกปฏิเสธ
จริง ๆ แล้วดี

26

คำตอบจำนวนมากในหน้านี้อ่อนแอเนื่องจากไม่จัดการกรณีทั่วไปของสิ่งที่อาจเกิดขึ้นในรูปแบบ CSV เช่นเครื่องหมายจุลภาคและเครื่องหมายคำพูดฝังอยู่ในเขตข้อมูลและเงื่อนไขอื่น ๆ ที่มักจะเกิดขึ้นในที่สุด เราต้องการโซลูชันทั่วไปที่ใช้งานได้กับข้อมูลอินพุต CSV ที่ถูกต้องทั้งหมด

นี่เป็นวิธีแก้ปัญหาที่ง่ายและแข็งแกร่งใน 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)

ตั้งชื่อไฟล์tab2csvนั้นวางไว้บนเส้นทางของคุณให้สิทธิ์ดำเนินการจากนั้นใช้ไฟล์ดังนี้:

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

ฟังก์ชันการจัดการ Python CSV ครอบคลุมกรณีมุมสำหรับรูปแบบการป้อนข้อมูล CSV

สิ่งนี้อาจได้รับการปรับปรุงเพื่อจัดการกับไฟล์ขนาดใหญ่ผ่านวิธีการสตรีม


8
โซลูชันที่เชื่อถือได้มากขึ้นคือการเชื่อมต่อกับฐานข้อมูลด้วย Python จริง ๆ แล้วคุณควรมีเวลาทำสิ่งที่คุณต้องทำเพื่อจัดการกับชุดข้อมูลขนาดใหญ่ขึ้น
Josh Rumbut

@JoshRumbut ดึกมาก แต่ฉันทำstackoverflow.com/a/41840534/2958070เพื่อเติมเต็มความคิดเห็นของคุณ
Ben

24

จากบรรทัดคำสั่งของคุณคุณสามารถทำได้:

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*

เครดิต: การ ส่งออกตารางจาก Amazon RDS ไปยังไฟล์ csv


นั่นเป็นหนึ่งในผู้คลั่งไคล้บ้า Hatsoff
Elias Escalante

17
  1. ตรรกะ:

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

เมื่อคุณสร้างตาราง CSV เซิร์ฟเวอร์จะสร้างไฟล์รูปแบบตารางในไดเรกทอรีฐานข้อมูล ไฟล์เริ่มต้นด้วยชื่อตารางและมีนามสกุล. frm เอ็นจิ้นการจัดเก็บยังสร้างไฟล์ข้อมูล ชื่อของมันเริ่มต้นด้วยชื่อตารางและมีนามสกุล. CSV ไฟล์ข้อมูลเป็นไฟล์ข้อความธรรมดา เมื่อคุณเก็บข้อมูลลงในตารางเอ็นจิ้นการจัดเก็บจะบันทึกลงในไฟล์ข้อมูลในรูปแบบค่าที่คั่นด้วยเครื่องหมายจุลภาค


1
ดีเนื่องจากนี่ถูกต้องโดยไม่ต้องทำการปรับแต่งอื่นใด
Andrew Schulman

13

คำตอบนี้ใช้งูหลามและห้องสมุดของบุคคลที่สามที่เป็นที่นิยมPyMySQL ฉันกำลังเพิ่มเนื่องจากไลบรารีcsvของ Python นั้นทรงพลังพอที่จะจัดการกับรสชาติที่หลากหลายได้อย่างถูกต้อง.csvและไม่มีคำตอบอื่นใดที่ใช้รหัส Python เพื่อโต้ตอบกับฐานข้อมูล

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

ให้คำตอบโดยใช้ python แล้ว stackoverflow.com/a/35123787/5470883
Alexander Baltasar

4
@AlexanderBaltasar ใช่มั้ยและมันมีประโยชน์ แต่มันไม่ได้ใช้รหัส Python เพื่อโต้ตอบกับฐานข้อมูล ดูความคิดเห็นเกี่ยวกับคำถามนั้น
Ben

11

ง่ายและทำงานได้ทุกอย่างโดยไม่ต้องใช้โหมดแบตช์หรือไฟล์เอาต์พุต

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, ...)

แค่นั้นแหละ!


1
โปรดทราบว่าNULLค่าจะถูกข้ามไปconcat_ws()ส่งผลให้เกิดคอลัมน์ที่ไม่ตรงกัน เพื่อหลีกเลี่ยงปัญหานี้เพียงแค่ใช้สตริงว่างแทน: IFNULL(field, '')(หรืออะไรก็ตามที่คุณใช้เพื่อเป็นตัวแทนNULL)
Marco Roy

10

อีกทางเลือกหนึ่งสำหรับคำตอบข้างต้นคุณสามารถมีตาราง MySQL ที่ใช้เอ็นจิ้น CSV

จากนั้นคุณจะมีไฟล์บนฮาร์ดดิสก์ที่จะอยู่ในรูปแบบ CSV ซึ่งคุณสามารถคัดลอกได้โดยไม่ต้องดำเนินการ


1
ข้อ จำกัด ของสิ่งนี้ในแง่ของขนาดไฟล์ / การเขียน / การอ่าน / ฯลฯ คืออะไร?
Zach Smith

8

หากต้องการขยายคำตอบก่อนหน้าหนึ่งซับต่อไปนี้จะส่งออกตารางเดียวเป็นไฟล์ที่คั่นด้วยแท็บ เหมาะสำหรับระบบอัตโนมัติการส่งออกฐานข้อมูลทุกวัน

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

สะดวกเราสามารถใช้เทคนิคเดียวกันเพื่อแสดงรายการตารางของ MySQL และเพื่ออธิบายเขตข้อมูลในตารางเดียว:

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    

4
ในการแปลงเป็น CSV:mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
DSimon

7
การใช้sed -e 's/\t/,/g'จะปลอดภัยก็ต่อเมื่อคุณแน่ใจว่าข้อมูลของคุณไม่มีเครื่องหมายจุลภาคหรือแท็บใด ๆ
awatts

7

สร้างจากผู้ใช้ 7610 นี่คือวิธีที่ดีที่สุดที่จะทำ เนื่องจาก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);

?>

1
ดีสะอาดและทำงานได้อย่างรวดเร็ว - นี่เป็นทางออกที่ดีถ้าคุณสามารถเรียกใช้ PHP ในสภาพแวดล้อมนั้น!
John Fiala

7

นอกจากนี้หากคุณกำลังดำเนินการค้นหาในบรรทัดคำสั่ง Bash ฉันเชื่อว่าtrสามารถใช้คำสั่งเพื่อแทนที่แท็บเริ่มต้นเป็นตัวคั่นโดยพลการ

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


5

นี่คือสิ่งที่ฉันทำ:

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

สคริปต์ perl (sniped จากที่อื่น) ทำงานได้ดีในการแปลงฟิลด์ที่เว้นระยะแท็บเป็น CSV


มันเยี่ยมมาก การปรับปรุงเล็กน้อยอาจจะอ้างอิงทุกอย่างยกเว้นตัวเลขperl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '- คุณจะไม่พูด1.2.3
artfulrobot

5

ไม่ตรงกับรูปแบบ CSV แต่สามารถใช้teeคำสั่งจากไคลเอนต์ MySQL เพื่อบันทึกผลลัพธ์ลงในไฟล์ภายในเครื่อง :

tee foobar.txt
SELECT foo FROM bar;

noteeคุณสามารถปิดได้โดยใช้

ปัญหาSELECT … INTO OUTFILE …;คือมันต้องได้รับอนุญาตในการเขียนไฟล์ที่เซิร์ฟเวอร์


หากมีการใช้ส่วนขยาย. csv แทน. txt จะมีปัญหาการจัดรูปแบบใดบ้างที่ควรระวัง?
datalifenyc

@myidealab ปัญหาการจัดรูปแบบเกิดขึ้นจากเครื่องหมายจุลภาคและอื่น ๆ ที่ไม่ถูกหลีกเลี่ยง CSV เป็นรูปแบบข้อความล้วนดังนั้นจึงไม่มีปัญหาการจัดรูปแบบเพียงแค่สลับส่วนขยายออก
jkmartindale

3

เมื่อใช้วิธีแก้ปัญหาที่โพสต์โดย Tim ฉันสร้างสคริปต์ทุบตีนี้เพื่ออำนวยความสะดวกในกระบวนการ (ขอรหัสผ่านรูท แต่คุณสามารถแก้ไขสคริปต์ได้อย่างง่ายดายเพื่อขอผู้ใช้คนอื่น):

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

มันจะสร้างไฟล์ชื่อ: database.table.csv


3

หากคุณมีการตั้งค่า PHP บนเซิร์ฟเวอร์คุณสามารถใช้mysql2csvเพื่อส่งออกไฟล์ CSV (ถูกต้องจริง) สำหรับการค้นหา mysql ที่ผิดปกติ ดูคำตอบของฉันที่ MySQL - เลือก * เข้าสู่ภายในเครื่อง?สำหรับบริบท / ข้อมูลเพิ่มเติมเล็กน้อย

ฉันพยายามที่จะรักษาชื่อตัวเลือกจาก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

(ดาวน์โหลดเนื้อหาของส่วนสำคัญตรวจสอบการตรวจสอบและทำให้ปฏิบัติการ)


3

อะไรที่ทำให้ฉัน:

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 ของฉัน สำหรับผู้ที่มีปัญหาคล้ายกันให้ลองใช้บรรทัดที่ยกเลิกโดย \ r \ n แทน

อีกปัญหาหนึ่งสำหรับผู้ที่พยายามเปิด 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;

2

หากคุณได้รับข้อผิดพลาดจากsecure-file-privนั้นหลังจากเปลี่ยนตำแหน่งไฟล์ปลายทางภายในC:\ProgramData\MySQL\MySQL Server 8.0\Uploadsและหลังจากนั้นแบบสอบถาม -

SELECT * FROM attendance INTO OUTFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\FileName.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

ไม่ทำงานคุณต้องเปลี่ยน\(backsplash) จากแบบสอบถามเป็น/ (forwardsplash)

และนั่นก็ใช้งานได้ !!

ตัวอย่าง:

เลือก * จากการเข้าร่วมออก 'C: / ProgramData / MySQL / MySQL Server 8.0 / อัพโหลด / FileName.csv' ฟิลด์สิ้นสุดโดย ',' ENCLOSED โดย '' 'LINES สิ้นสุดโดย' \ n ';

แต่ละครั้งเมื่อคุณเรียกใช้คิวรีที่ประสบความสำเร็จมันจะสร้างไฟล์ csv ใหม่ทุกครั้ง! เจ๋งใช่มั้ย


1

สคริปต์ทุบตีเล็ก ๆ สำหรับการทำแบบสอบถามง่ายๆไปยัง 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"

1

สคริปต์ทุบตีต่อไปนี้ใช้งานได้สำหรับฉัน มันเป็นทางเลือกนอกจากนี้ยังได้รับสคีสำหรับตารางที่ร้องขอ

#!/bin/bash
#
# export mysql data to CSV
#/programming/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

1

ฉันพบปัญหาเดียวกันและคำตอบของ Paulไม่ได้เป็นตัวเลือกเนื่องจากเป็น RDS การแทนที่แท็บด้วยเครื่องหมายจุลภาคไม่ทำงานเนื่องจากข้อมูลมีเครื่องหมายจุลภาคและแท็บฝังอยู่ ฉันพบว่าmycliซึ่งเป็นทางเลือกแบบเลื่อนลงสำหรับไคลเอนต์ mysql รองรับเอาต์พุต csv นอกกรอบด้วยการ--csvตั้งค่าสถานะ

mycli db_name --csv -e "select * from flowers" > flowers.csv

1

หากคุณได้รับข้อผิดพลาดนี้ในขณะที่คุณพยายามส่งออกไฟล์ของคุณ

ข้อผิดพลาด 1290 (HY000): เซิร์ฟเวอร์ MySQL กำลังทำงานกับตัวเลือก --secure-file-priv ดังนั้นจึงไม่สามารถดำเนินการตามคำสั่งนี้ได้

และคุณไม่สามารถแก้ไขข้อผิดพลาดนี้ได้ คุณสามารถทำสิ่งหนึ่งโดยเรียกใช้สคริปต์หลามนี้

import mysql.connector
import csv

con = mysql.connector.connect(
    host="localhost",
    user="root",
    passwd="Your Password"
)

cur = con.cursor()

cur.execute("USE DbName")
cur.execute("""
select col1,col2 from table
where <cond>
""")

with open('Filename.csv',mode='w') as data:
    fieldnames=["Field1","Field2"]
    writer=csv.DictWriter(data,fieldnames=fieldnames)
    writer.writeheader()
    for i in cur:
        writer.writerow({'Field1':i[0],'Field2':i[1]})

ยินดีต้อนรับสู่ Stack Overflow! สิ่งนี้ไม่ตอบคำถาม โปรดตรวจสอบstackoverflow.com/help/how-to-answer
stephenwade

0

หากมีการติดตั้ง PHP ในเครื่องที่คุณใช้คุณสามารถเขียนสคริปต์ PHP เพื่อทำเช่นนั้น มันต้องการการติดตั้ง PHP ที่มีการติดตั้งส่วนขยายของ MySQL

คุณสามารถเรียกล่าม PHP จากบรรทัดคำสั่งดังนี้:

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

ฉันรวม--php-iniสวิตช์ไว้ด้วยเพราะคุณอาจต้องใช้การกำหนดค่า PHP ของคุณเองเพื่อเปิดใช้งานส่วนขยาย MySQL ใน 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 เป็นส่วนหนึ่งของข้อความไม่ใช่ตัวคั่นบันทึก นั่นคือสิ่งที่ยากที่จะถูกต้องหลังจากนั้นsedหรือดังนั้น


1
ไกลจากความซับซ้อนโดยไม่จำเป็นนี่เป็นทางออกเดียวที่จะไปในทิศทางที่ถูกต้อง - แม้ว่าจะมีงานเพิ่มขึ้นอีกเล็กน้อย CSV มีความซับซ้อนมากกว่าที่ปรากฏครั้งแรกและคุณทำผิดพลาดหลายอย่าง เช่นแบ็กสแลชในต้นฉบับ ดีกว่าที่จะใช้ห้องสมุดที่แก้ปัญหาทั้งหมดในการเขียนเป็น CSV
mc0e

@ mc0e โดยปกติคุณทั้งสองอ้างหรือหนีจากคำพูด ฉันตัดสินใจที่จะเพิ่มเครื่องหมายคำพูดเป็นสองเท่าดังนั้นฉันจึงไม่จำเป็นต้องมีอักขระเลี่ยง ซอฟต์แวร์ที่ต่างกันมีแนวคิดที่แตกต่างกันเกี่ยวกับรายละเอียด CSV ตัวอย่างเช่น LOAD DATA ใน MySQL ถือว่าเป็นตัวอักษร \ เป็นตัวหนีในขณะที่ Open Office Calc ไม่ เมื่อฉันเขียนคำตอบฉันกำลังส่งออกข้อมูลไปยังสเปรดชีต
user7610

1
รหัสของฉันจัดการทุกอย่างที่จำเป็นในการส่งออกชุดข้อมูลของฉันกลับมาในวันนั้น) คำตอบของคุณเป็นขั้นตอนในทิศทางที่ถูกต้อง แต่เป็นความคิดเห็นแรกบอกว่ามันควร 1) เชื่อมต่อกับฐานข้อมูล sql จากสคริปต์โดยตรง เช่นเดียวกับ 2) ใช้ไลบรารี csv ที่เหมาะสม
user7610
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.