CSV प्रारूप में MySQL क्वेरी परिणाम कैसे आउटपुट करें?


1183

क्या लिनक्स कमांड लाइन से MySQL क्वेरी को चलाने और 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 16

में [इस stackoverflow] मेरा उत्तर को देखो [1] [1]: stackoverflow.com/questions/12242772/...
biniam



मैंने मारियाडीबी बग ट्रैकर ( jira.mariadb.org/browse/MDEV-12879 ) पर एक सुविधा अनुरोध लिखा है । आप इस पर वोट कर सकते हैं।
बेरेड बेक

जवाबों:


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

इस कमांड कॉलम का उपयोग करके नाम निर्यात नहीं किए जाएंगे।

यह भी ध्यान रखें कि MySQL चलाने /var/lib/mysql-files/orders.csvवाले सर्वर पर होगा । MySQL प्रक्रिया के तहत चल रहे उपयोगकर्ता के पास चुनी गई निर्देशिका को लिखने की अनुमति होनी चाहिए, या कमांड विफल हो जाएगी।

यदि आप किसी दूरस्थ सर्वर (विशेष रूप से होस्टेड या वर्चुअलाइज़ मशीन जैसे हरोकू या अमेज़ॅन आरडीएस) से अपने स्थानीय मशीन को आउटपुट लिखना चाहते हैं, तो यह समाधान उपयुक्त नहीं है।


16
@ टॉमा यदि आपके पास किसी दूरस्थ फाइल सिस्टम और MySQL तक पहुंच है, तो आपको कहीं न कहीं लिखने में सक्षम होना चाहिए। / tmp के बजाय, /home/yourusername/file.csv आज़माएं - यदि वह विफल रहता है, और परिणाम सेट इतना बड़ा नहीं है, तो आप अपने SSH क्लाइंट से आउटपुट कॉपी कर सकते हैं और अपने स्थानीय मशीन पर पेस्ट कर सकते हैं।
माइकल बटलर

63
प्रश्न ने MySQL को निर्दिष्ट किया, न कि "मानकों का अनुपालन"।
पॉल टॉम्बलिन

35
हेडर कैसे शामिल करें?
बोगदान गुसिएव

66
@BogdanGusiev, आप वास्तविक क्वेरी से पहले "Select 'order_id', 'product_name', 'qty' UNION" को जोड़कर हेडर शामिल कर सकते हैं। पहले क्वेरी रिटर्न हेडर का चयन करें, दूसरा क्वेरी वास्तविक डेटा देता है; UNION इसे एक साथ जोड़ता है।
पेट्रोकेक

19
@ मिचेल बटलर: ठीक है, नहीं, वास्तव में। यदि आप अमेज़ॅन आरडीएस, हरोकू या किसी अन्य होस्ट किए गए समाधान का उपयोग कर रहे हैं, तो आप किसी अन्य व्यक्ति के सर्वर पर लिखने में सक्षम होने की संभावना नहीं रखते हैं।
केन किंडर

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

जो टैब अलग किया गया है। एक सच्चा CSV पाने के लिए इसे ऐसे ही पाइप करें (धन्यवाद @therefromhere):

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

5
इतना ही नहीं, लेकिन यह स्थानीय फाइल सिस्टम के लेखन के अन्य के विपरीत, दूरस्थ डेटाबेस होस्ट से सामग्री बनाने की अनुमति देता है।
tmarthal

31
यह टैब-अलग है, अल्पविराम से अलग नहीं है।
फ्लिम्स

13
@ फ़ीलम, यह मानते हुए कि आपके पास खेतों में कॉमा / टैब नहीं हैं, आप इसे परिणाम में बदल कर परिवर्तित कर सकते हैं| sed 's/\t/,/g'
जॉन कार्टर

111
sed 'फिक्स' कॉमा के लिए क्षतिपूर्ति नहीं करता है जो किसी भी चयनित डेटा में दिखाई दे सकता है और आपके कॉलम को उसी के अनुसार आउटपुट करेगा
जॉय टी

14
नकारात्मकता वैध है .. यह अब आपके लिए काम कर सकती है, लेकिन यह भविष्य में आपको अच्छी तरह से काट सकती है जब आपके डेटा में टैब या अल्पविराम आदि शामिल हों ..
जॉन हंट

204

mysql --batch, -B

स्तंभ विभाजक के रूप में टैब का उपयोग करके प्रिंट परिणाम, एक नई पंक्ति पर प्रत्येक पंक्ति के साथ। इस विकल्प के साथ, mysql इतिहास फ़ाइल का उपयोग नहीं करता है। बैच मोड का परिणाम गैर-सारणीबद्ध आउटपुट प्रारूप और विशेष वर्णों के भागने से होता है। कच्चे मोड का उपयोग करके भागने को अक्षम किया जा सकता है; --raw विकल्प के लिए विवरण देखें।

यह आपको एक टैब से अलग फाइल देगा। चूंकि अल्पविराम (या कॉमा युक्त तार) बच नहीं रहे हैं, यह सीमांकक को अल्पविराम में बदलने के लिए सीधा नहीं है।


12
यह एक पसंदीदा समाधान है: 1) टैब-अलग-अलग-मूल्य सूची UNIX 2 में आम हैं) TSV आयात मूल रूप से अधिकांश आयात प्रणालियों द्वारा समर्थित हैं, जिसमें Excel, OpenOffice Spreadsheets, आदि 3 शामिल हैं) पाठ 4 के लिए उद्धरण वर्णों से बचने की कोई आवश्यकता नहीं है। ) कमांड-लाइन निर्यात को एक हवा बनाता है
जॉय टी

5
यह सबसे अच्छा समाधान है क्योंकि पहले एक के विपरीत आरडीएस जैसे सर्वरों की अनुमति की आवश्यकता नहीं है
मुय्याद अलसादी

8
एक साफ-सुथरी चाल: यदि आप .csv के बजाय .xls के रूप में टैब से अलग की गई फ़ाइल को सहेजते हैं, तो यह "टेक्स्ट टू डेटा" रूपांतरण और किसी भी क्षेत्रीय सेटिंग्स के मुद्दों के बिना किसी भी आवश्यकता के बिना एक्सेल में खुलेगा।
सर्बूट

3
@ जॉय टी - आपको अभी भी टैब और कैरिज रिटर्न से बचने की आवश्यकता है। इसके अलावा अगर किसी क्षेत्र की सामग्री उद्धृत या बच गए क्षेत्र की तरह दिखती है, तो आयातित सामग्री मूल की तरह नहीं दिख सकती है।
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

बहुत अच्छा काम करता है। एक बार फिर से हालांकि एक रेगेक्स केवल लिखने के लिए साबित होता है।


रेगेक्स स्पष्टीकरण:

  • 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

3
-E झंडा वास्तव में क्या मैं देख रहा था! धन्यवाद!
गौरव गुप्ता

1
यह रेगेक्स वास्तव में काफी सरल है; इस पृष्ठ पर बहुत सारे अन्य उत्तरों की तरह, इसका सिर्फ आउटपुट से सफाई है mysql -B। यदि आपने अलग-अलग पंक्तियों में रेगेक्स को अलग-अलग बयानों में अलग किया है, तो यह समझने के लिए काफी सरल होगा (रेगेक्स को जानने वाले के लिए)।
मेई

7
पहली नज़र में, यह बहुत टूटा हुआ लग रहा है। सामग्री में टैब और गाड़ी का रिटर्न गलत तरीके से दिया जाएगा। "s / '/ \' /," कुछ भी नहीं करता है, क्योंकि शेल कमांड में दोहरे उद्धरण बैकस्लैश का उपभोग करते हैं। बैकस्लैश खो जाने के साथ कई अन्य समान कीड़े। Db फ़ील्ड में बैकस्लैश के लिए कोई हैंडलिंग नहीं है।
mc0e

1
ऐसा लगता है कि यह कमांड लिनक्स पर अच्छा काम करता है लेकिन मैक
हेमरसन वरेला में नहीं

6
यदि आपके पास एक पाठ फ़ील्ड है जिसमें टैब, बैकस्लैश ","और कई अन्य चीजें हैं, तो यह टूट जाएगा । एक regex है नहीं इस समस्या को हल करने के लिए जिस तरह से
एडन

93

यूनिक्स / सिगविन केवल, इसे 'ट्र' के माध्यम से पाइप करें:

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

NB: यह न तो एम्बेडेड कॉमा, और न ही एम्बेडेड टैब को संभालता है।


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

@PressingOnAlways हां। MySQL doc उद्धरण: "स्तंभ विभाजक के रूप में टैब का उपयोग करके प्रिंट परिणाम, एक नई पंक्ति पर प्रत्येक पंक्ति के साथ।" लेकिन पार्सिंग किसी भी सीमांकक के साथ एक समस्या नहीं होनी चाहिए। मैंने अपने क्लाइंट के लिए एक्सेल फाइल बनाने के लिए इसका इस्तेमाल किया।
hrvoj3e

39

पॉल टॉम्बलिन द्वारा दिए गए OUTFILE समाधान के कारण MySQL सर्वर पर एक फाइल ही लिखी जाती है, इसलिए यह केवल तभी काम करेगा जब आप FILE एक्सेस हो, साथ ही उस बॉक्स से फाइल को पुनः प्राप्त करने के लिए लॉगिन एक्सेस या अन्य साधन।

यदि आपके पास ऐसी पहुंच नहीं है, और टैब-सीमांकित आउटपुट CSV के लिए एक उचित विकल्प है (जैसे, यदि आपका अंतिम लक्ष्य Excel में आयात करना है), तो Serbaut का समाधान (उपयोग mysql --batchऔर वैकल्पिक रूप से --raw) जाने का रास्ता है।


36

MySQL कार्यक्षेत्र CSV को रिकॉर्डसेट निर्यात कर सकता है, और यह खेतों में कॉमा को बहुत अच्छी तरह से संभालता है। CSV ओपनऑफिस फाइन में खुलता है।


2
धन्यवाद एक लाख डेविड। डेटा में HTML सामग्री के लिए ठीक से आउटपुट करने के लिए 3 घंटे की नई रूपरेखा प्राप्त करने के बाद, मैंने MySQL कार्यक्षेत्र का उपयोग किया और 2 मिनट में मेरे पास मेरी CSV फ़ाइल तैयार थी।
एमआर-यूरो

मैंने अभी पाया है कि यह XML के रूप में भी सहेज सकता है, जो कि बहुत अच्छा है। मैं इस XML को एक CSV फ़ाइल में परिवर्तित करने के लिए XSLT का उपयोग करके एक एप्लिकेशन से दूसरे एप्लिकेशन पर माइग्रेट करने की उम्मीद कर रहा हूं, जो लक्ष्य एप्लिकेशन में आयात करने के लिए उपयुक्त है।
डेविड ओलिवर

आयात निर्यात सुविधा के लिए mysql कार्यक्षेत्र सबसे अच्छा विकल्प है।
cijagani

1
मैं अभी सफलतापूर्वक mysql कार्यक्षेत्र का उपयोग करते हुए आधे मिलियन से अधिक पंक्तियों का निर्यात करता हूं ताकि बड़ी फ़ाइलों को समस्या न हो। आपको बस यह सुनिश्चित करना है कि आप अपनी क्वेरी चलाने से पहले चयन सीमा को हटा दें और आपको अपनी my.ini फ़ाइल में निम्न मान भी बढ़ाने पड़ सकते हैं: max_allowed_packet = 500M, net_read_timeout = 600, net_write_timeout = 600
विंसेंट

3
CSV में डेटा निर्यात करते समय MySQL कार्यक्षेत्र में एक शर्मनाक मेमोरी लीक होती है, यदि आपके पास 1 या 2 मिलियन अधिक पंक्तियों जैसे बड़े डेटा सेट हैं, तो 12 GB RAM (मेरी लिनक्स मशीन पर परीक्षण किया गया) पर्याप्त नहीं हैं और मेमोरी तब तक साफ़ नहीं होती जब तक कि आप इसे मारें या रोकें। बड़े डेटा सेट के लिए यह एक समाधान नहीं है।
15

33

कैसा रहेगा:

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

2
मुझे यह वास्तव में पसंद है। यह बहुत क्लीनर है, और मुझे जाग का उपयोग पसंद है। हालाँकि, मैं शायद इस के साथ चला गया होगा: mysql -uUser -pPassword your_database < my_requests.sql | awk 'BEGIN{OFS="=";} {print $1,$2}' > out.csv
जोश

7
यह रिक्त स्थान के साथ फ़ील्ड मानों के लिए विफल रहता है।
बारुण शर्मा

29

MySQL कार्यक्षेत्र एक को छोड़कर आज तक के सभी समाधान गलत हैं और संभवतः संभवतः mysql db में कम से कम कुछ संभावित सामग्री के लिए असुरक्षित (यानी सुरक्षा मुद्दे) हैं।

MYSQL कार्यक्षेत्र (और इसी तरह PHPMyAdmin) एक औपचारिक रूप से सही समाधान प्रदान करते हैं, लेकिन उपयोगकर्ता के स्थान पर आउटपुट डाउनलोड करने के लिए डिज़ाइन किए गए हैं। वे डेटा निर्यात को स्वचालित करने जैसी चीजों के लिए इतने उपयोगी नहीं हैं।

के आउटपुट से मज़बूती से सही सीएसवी उत्पन्न करना संभव नहीं है mysql -B -e 'SELECT ...' क्योंकि यह खेतों में गाड़ी के रिटर्न और सफेद स्थान को सांकेतिक नहीं कर सकता है। Mysql को '-s' फ्लैग बैकस्लैश एस्केपिंग करता है, और इससे सही समाधान हो सकता है। हालांकि, एक स्क्रिप्टिंग भाषा (सभ्य आंतरिक डेटा संरचनाओं के साथ एक का उपयोग करना, जो बैश नहीं है), और लाइब्रेरीज़ जहां एन्कोडिंग मुद्दों को पहले से ही सावधानी से काम किया गया है, बहुत सुरक्षित है।

मैंने इसके लिए एक स्क्रिप्ट लिखने के बारे में सोचा था, लेकिन जैसे ही मैंने सोचा कि मैं इसे क्या कहूंगा, यह मुझे उसी नाम से पहले से मौजूद काम की खोज करने के लिए हुआ। जब तक मैं इसे पूरी तरह से खत्म नहीं कर चुका, https://github.com/robmiller/mysql2csv पर समाधान आशाजनक लगता है। आपके आवेदन के आधार पर, SQL कमांड को निर्दिष्ट करने के लिए yaml दृष्टिकोण हालांकि अपील नहीं कर सकता है या नहीं। मैं भी अपने Ubuntu 12.04 लैपटॉप या डेबियन स्क्वीज़ सर्वर के साथ मानक के रूप में आता है माणिक के अधिक हालिया संस्करण की आवश्यकता से रोमांचित नहीं हूं। हां मुझे पता है कि मैं आरवीएम का उपयोग कर सकता हूं, लेकिन मैं इस तरह के एक सरल उद्देश्य के लिए इसे बनाए नहीं रखूंगा।

उम्मीद है कि कोई उपयुक्त उपकरण को इंगित करेगा, वह परीक्षण का एक सा है। अन्यथा मैं शायद इसे तब अपडेट करूंगा जब मैं इसे ढूंढूंगा या लिखूंगा।


1
आप सही हैं, टेबल में जटिल तारों के लिए आपको कुछ सभ्य पुस्तकालय का उपयोग करना होगा, न कि केवल बैश। मुझे लगता है कि इस तरह के कार्यों के लिए नोडज का बेहतर समाधान है। इस तरह के उदाहरण
yeya

1
नमस्ते, अच्छा जवाब, मैं stackoverflow.com/a/35123787/1504300 के नीचे प्रस्तावित अजगर समाधान के लिए एक लिंक जोड़ूंगा , जो अच्छी तरह से काम करता है और बहुत सरल है। मैंने आपके पोस्ट को संपादित करने की कोशिश की, लेकिन संपादन को अस्वीकार कर दिया गया है
वास्तव में

26

इस पृष्ठ के कई उत्तर कमजोर हैं क्योंकि वे सीएसवी प्रारूप में सामान्य स्थिति को संभाल नहीं सकते हैं। उदाहरण के लिए, अल्पविराम और उद्धरण खेतों और अन्य स्थितियों में एम्बेडेड होते हैं जो हमेशा अंततः आते हैं। हमें एक सामान्य समाधान की आवश्यकता है जो सभी मान्य 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

पायथन सीएसवी-हैंडलिंग फ़ंक्शन सीएसवी इनपुट प्रारूप (एस) के लिए कोने के मामलों को कवर करता है।

स्ट्रीमिंग दृष्टिकोण के माध्यम से बहुत बड़ी फ़ाइलों को संभालने के लिए इसे बेहतर बनाया जा सकता है।


8
एक और भी भरोसेमंद समाधान वास्तव में पायथन के साथ डेटाबेस से जुड़ना होगा, फिर आपके पास एक आसान समय होना चाहिए जो आपको बड़े डेटासेट (चैंकिंग परिणाम, स्ट्रीमिंग, आदि) से निपटने के लिए करना होगा।
जोश रंबुत

@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*

क्रेडिट: अमेज़ॅन आरडीएस से एक csv फ़ाइल में निर्यात तालिका


एक पागल oneliner thats। हैटसॉफ़
एलियास

17
  1. तर्क :

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

जब आप CSV तालिका बनाते हैं, तो सर्वर डेटाबेस निर्देशिका में एक तालिका प्रारूप फ़ाइल बनाता है। फ़ाइल तालिका नाम से शुरू होती है और इसमें .frm एक्सटेंशन होता है। स्टोरेज इंजन एक डेटा फ़ाइल भी बनाता है। इसका नाम तालिका के नाम से शुरू होता है और इसमें एक .CSV एक्सटेंशन होता है। डेटा फ़ाइल एक सादा पाठ फ़ाइल है। जब आप तालिका में डेटा संग्रहीत करते हैं, तो भंडारण इंजन इसे अल्पविराम से अलग किए गए मान प्रारूप में डेटा फ़ाइल में सहेजता है।


1
अच्छा है क्योंकि यह किसी भी अन्य समायोजन की आवश्यकता के बिना सही है।
एंड्रयू शुलमैन 21

13

यह उत्तर पायथन और एक लोकप्रिय तीसरे पक्ष के पुस्तकालय, PyMySQL का उपयोग करता है । मैं इसे जोड़ रहा हूं क्योंकि पायथन की सीएसवी लाइब्रेरी बहुत से विभिन्न स्वादों को सही ढंग से संभालने के लिए पर्याप्त शक्तिशाली है .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
# /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)

अजगर का उपयोग कर एक उत्तर पहले से ही प्रदान किया गया था। stackoverflow.com/a/35123787/5470883
अलेक्जेंडर बाल्टासर

4
@AlexanderBaltasar, सही है, और यह उपयोगी दिखता है, लेकिन यह डेटाबेस के साथ बातचीत करने के लिए पायथन कोड का उपयोग नहीं कर रहा है। उस सवाल पर उस पर टिप्पणी देखें।
बेन

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)
मार्को रॉय

10

वैकल्पिक रूप से ऊपर दिए गए उत्तर के लिए, आपके पास एक MySQL तालिका हो सकती है जो CSV इंजन का उपयोग करती है।

तब आपकी हार्ड डिस्क पर एक फ़ाइल होगी जो हमेशा एक सीएसवी प्रारूप में होगी जिसे आप इसे संसाधित किए बिना केवल कॉपी कर सकते हैं।


1
फ़ाइल आकार / लिखने / पठन / आदि के संदर्भ में इसकी क्या सीमाएँ हैं?
ज़च स्मिथ

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

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

?>

1
अच्छा, स्वच्छ, और जल्दी से काम करता है - यह एक बढ़िया समाधान है यदि आप उस वातावरण में PHP चला सकते हैं!
जॉन फियाला

7

इसके अलावा, यदि आप बैश कमांड लाइन पर क्वेरी कर रहे हैं, तो मेरा मानना ​​है कि 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

पर्ल स्क्रिप्ट (अन्यत्र से छीनी गई) टैब स्पैड फ़ील्ड को CSV में परिवर्तित करने का अच्छा काम करती है।


यह भी खूब रही। संख्याओं को छोड़कर सब कुछ सुधारने के लिए थोड़ा सुधार हो सकता है perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '- आपका उद्धरण नहीं होगा1.2.3
आर्टफ्लोरोबोट

5

सीएसवी प्रारूप के रूप में बिल्कुल नहीं, लेकिन आउटपुट को स्थानीय फ़ाइल में सहेजने के लिए MySQL क्लाइंट से teeकमांड का उपयोग किया जा सकता है :

tee foobar.txt
SELECT foo FROM bar;

आप इसका उपयोग करके अक्षम कर सकते हैं notee

इसके साथ समस्या SELECT … INTO OUTFILE …;यह है कि इसे सर्वर पर फाइलें लिखने के लिए अनुमति की आवश्यकता होती है।


यदि। Txt के स्थान पर .csv एक्सटेंशन का उपयोग किया जाता है, तो क्या इसके बारे में जागरूक होने के लिए कोई प्रारूपण मुद्दे हैं?
datalifenyc

@myidealab स्वरूपण समस्याएँ अल्पविराम आदि से उत्पन्न होती हैं, जो बच नहीं रही हैं। CSV एक सादा पाठ प्रारूप है, इसलिए एक्सटेंशन को स्वैप करने से कोई स्वरूपण समस्या नहीं है।
jkmartindale

3

टिम द्वारा पोस्ट किए गए समाधान का उपयोग करते हुए, मैंने प्रक्रिया को सुविधाजनक बनाने के लिए यह बैश स्क्रिप्ट बनाई (रूट पासवर्ड का अनुरोध किया गया है, लेकिन आप किसी अन्य उपयोगकर्ता से पूछने के लिए आसानी से स्क्रिप्ट को संशोधित कर सकते हैं):

#!/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 पर मेरा उत्तर देखें - SELECT * INTUT OUTFILE LOCAL? थोड़ा और संदर्भ / जानकारी के लिए।

मैंने विकल्प नामों को बनाए रखने की कोशिश की 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';

इस थ्रेड पर किसी भी समाधान ने मेरे विशेष मामले के लिए काम नहीं किया, मेरे पास स्तंभों में से एक के अंदर बहुत जोंस डेटा था, जो मेरे सीएसवी आउटपुट में गड़बड़ हो जाएगा। समान समस्या वाले लोगों के लिए, इसके बजाय \ r \ n द्वारा समाप्त की गई लाइनें आज़माएँ।

माइक्रोसॉफ्ट एक्सेल के साथ सीएसवी को खोलने की कोशिश करने वालों के लिए भी एक और समस्या है, ध्यान रखें कि 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)

और वह काम करता है !!

उदाहरण:

उपस्थिति * OUTFILE से C * का चयन करें।

हर बार जब आप सफल क्वेरी चलाते हैं, तो यह हर बार नई सीएसवी फ़ाइल उत्पन्न करेगा! बिल्कुल सटीक?


1

Https://stackoverflow.com/a/5395421/2841607 से प्रेरित होकर CSV डंप को सरल क्वेरी करने के लिए टिनी बैश स्क्रिप्ट ।

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

मैं एक ही समस्या का सामना कर रहा था और पॉल का जवाब एक विकल्प नहीं था क्योंकि यह आरडीएस था। कॉमा के साथ टैब को बदलने से काम नहीं हुआ क्योंकि डेटा में कॉमा और टैब एम्बेडेड थे। मैंने पाया कि mycli जो mysql- क्लाइंट के लिए ड्रॉप-इन विकल्प है, --csvझंडे के साथ बॉक्स के बाहर csv आउटपुट का समर्थन करता है

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

1

यदि आपको अपनी फ़ाइल निर्यात करने का प्रयास करते समय यह त्रुटि हो रही है

ERROR 1290 (HY000): MySQL सर्वर --secure-file-private विकल्प के साथ चल रहा है, इसलिए यह इस कथन को निष्पादित नहीं कर सकता है

और आप इस त्रुटि को हल करने में सक्षम नहीं हैं। आप केवल इस अजगर स्क्रिप्ट को चलाकर एक काम कर सकते हैं

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]})

ढेर अतिप्रवाह में आपका स्वागत है! इस सवाल का जवाब नहीं है। कृपया stackoverflow.com/help/how-to-answer की समीक्षा करें ।
स्टीफनवेड

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 और text फ़ील्ड के साथ कोई समस्या नहीं है, जिसमें टेक्स्ट में newlines हैं। उन क्षेत्रों को सही ढंग से उद्धृत किया गया है और उन में उन नई खबरों की व्याख्या सीएसवी पाठक द्वारा पाठ के एक हिस्से के रूप में की जाएगी, न कि विभाजकों को रिकॉर्ड करने के लिए। यह कुछ ऐसा है जो बाद में सेड के साथ सही करना मुश्किल है ।


1
अनावश्यक रूप से जटिल होने से दूर, यह यहाँ एकमात्र समाधान है जो एक दिशा में सही होने की संभावना रखता है - यद्यपि थोड़ा और अधिक काम। CSV पहले दिखाई देने की तुलना में अधिक जटिल है, और आपने कई तरह की गलतियाँ की हैं। उदाहरण के लिए मूल में बैकस्लैश। एक पुस्तकालय का उपयोग करने के लिए बेहतर है जिसने सीएसवी को लिखने के लिए सभी मुद्दों पर काम किया है।
mc0e

@ mc0e आमतौर पर आप या तो बोली को दोगुना कर देते हैं या बोली से बच जाते हैं। मैंने बोली को दोगुना करने का फैसला किया, इसलिए मुझे भागने के पात्र की आवश्यकता नहीं है। विभिन्न सॉफ्टवेयर में CSV के विवरण के बारे में अलग-अलग विचार हैं। उदाहरण के लिए, MySQL में LOAD DATA वास्तव में \ N से बच चरित्र के रूप में व्यवहार करता है, जबकि ओपन ऑफिस Calc नहीं करता है। जब मैंने उत्तर लिखा तो मैं एक स्प्रेडशीट में डेटा निर्यात कर रहा था।
user7610

1
मेरा कोड दिन में वापस मेरे डेटासेट को निर्यात करने के लिए आवश्यक सब कुछ संभालता है;) आपका उत्तर भी सही दिशा में एक कदम है, लेकिन जैसा कि पहली टिप्पणी में कहा गया है, यह 1) स्क्रिप्ट से sql डेटाबेस से सीधे कनेक्ट होना चाहिए अच्छी तरह से 2) एक उचित सीएसवी पुस्तकालय का उपयोग करें।
user7610
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.