কীভাবে সিএসভি ফর্ম্যাটে মাইএসকিউএল ক্যোয়ারী ফলাফল আউটপুট করবেন?


1181

লিনাক্স কমান্ড লাইন থেকে কোনও মাইএসকিউএল কোয়েরি চালানোর এবং সিএসভি ফর্ম্যাটে ফলাফল আউটপুট দেওয়ার সহজ উপায় কি আছে ?

আমি এখন যা করছি তা এখানে:

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

এ [এই Stackoverflow] আমার উত্তর দিকে তাকান [1] [1]: stackoverflow.com/questions/12242772/...
biniam


2
এই স্ট্যাকওভারফ্লো প্রশ্নের স্বীকৃত উত্তর সম্ভবত সবচেয়ে ভাল উপায়: স্ট্যাকওভারফ্লো.
স্যামুয়েল -স্লুন্ড

আমি মারিয়াডিবি বাগ ট্র্যাকারে একটি বৈশিষ্ট্য অনুরোধ লিখেছি ( jira.mariadb.org/browse/MDEV-12879 ) আপনি এতে ভোট দিতে পারেন।
জ্যারেড বেক

উত্তর:


1761

Http://www.tech-recips.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হবে সার্ভার মাইএসকিউএল চলমান যে। মাইএসকিউএল প্রক্রিয়াটির অধীনে থাকা ব্যবহারকারীর অবশ্যই নির্বাচিত ডিরেক্টরিতে লেখার অনুমতি থাকতে হবে, অথবা কমান্ডটি ব্যর্থ হবে।

যদি আপনি কোনও দূরবর্তী সার্ভার (বিশেষত একটি হোস্টেড বা ভার্চুয়ালাইজ মেশিন যেমন হিরোকু বা অ্যামাজন আরডিএস) থেকে আপনার স্থানীয় মেশিনে আউটপুট লিখতে চান তবে এই সমাধানটি উপযুক্ত নয়।


16
@ টমাসের যদি আপনার কোনও দূরবর্তী ফাইল সিস্টেম এবং মাইএসকিউএল অ্যাক্সেস থাকে তবে আপনাকে অবশ্যই কোথাও লিখতে সক্ষম হতে হবে। / tmp এর পরিবর্তে, চেষ্টা করুন / home/yourusername/file.csv - যদি এটি ব্যর্থ হয় এবং ফলাফল সেটটি এত বড় না হয় তবে আপনি নিজের এসএসএইচ ক্লায়েন্টের আউটপুট অনুলিপি করতে এবং আপনার স্থানীয় মেশিনে পেস্ট করতে পারেন।
মাইকেল বাটলার

63
প্রশ্নটি মাইএসকিউএলকে নির্দিষ্ট করেছে, "মান সম্মত" নয়।
পল টমলিন

35
হেডারের পাশাপাশি কীভাবে অন্তর্ভুক্ত করা যায়?
বোগদান গুসিভ

66
@ বোগদানগুসিভ, আপনি আসল প্রশ্নের আগে "নির্বাচন 'অর্ডার_আইডি', 'পণ্য_নাম', 'কিউটি' ইউনিয়ন" প্রিপেন্ড করে হেডার অন্তর্ভুক্ত করতে পারেন। প্রথম নির্বাচন জিজ্ঞাসা শিরোনাম ফেরত, দ্বিতীয় কোয়েরি বাস্তব তথ্য ফেরত; ইউনিয়ন এটি একসাথে যোগদান।
পেট্রকোটেক

19
@ মিশেল বাটলার: আচ্ছা, না, আসলে। আপনি যদি অ্যামাজন আরডিএস, হেরোকু বা অন্য কোনও হোস্টেড সমাধান ব্যবহার করছেন তবে আপনার অন্য কারও সার্ভারে কেবল লেখার সম্ভাবনা কম।
কেন কিন্ডার

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

ট্যাব পৃথক করা হয়। সত্যিকারের সিএসভি পেতে এটির মতো পাইপ করুন (ধন্যবাদ এখানে থেকে):

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

5
কেবল এটিই নয়, এটি স্থানীয় ফাইল সিস্টেমে লেখার অন্যের মতো একটি দূরবর্তী ডাটাবেস হোস্ট থেকে সামগ্রী তৈরি করার অনুমতি দেয়।
টিমার্থাল

31
এটি ট্যাব-বিভক্ত, কমা-বিচ্ছিন্ন নয়।
ফ্লিম 15

13
@ ফ্লিম, ধরে নিচ্ছেন যে ক্ষেত্রগুলিতে আপনার এম্বেড কমা / ট্যাব নেই আপনি ফলাফলটি পাইপ করে রূপান্তর করতে পারেন| sed 's/\t/,/g'
জন কার্টার

111
সেড 'ফিক্স' নির্বাচিত যে কোনও ডেটাতে উপস্থিত হতে পারে এমন কমাগুলির জন্য ক্ষতিপূরণ দেয় না এবং সেই অনুযায়ী আপনার কলামগুলি আউটপুট করে দেবে
জোয়ে টি

14
নেতিবাচকতা বৈধ .. এটি এখন আপনার পক্ষে কাজ করতে পারে তবে ভবিষ্যতে এটি আপনাকে ভালভাবে কাটাতে পারে যখন আপনার ডেটাতে কোনও ট্যাব বা কমা ইত্যাদি অন্তর্ভুক্ত থাকে
জন হান্ট

203

মাইএসকিএল - ব্যাচ, -বি

নতুন লাইনের প্রতিটি সারি সহ কলাম বিভাজক হিসাবে ট্যাব ব্যবহার করে ফলাফলগুলি মুদ্রণ করুন। এই বিকল্পের সাথে, মাইএসকিএল ইতিহাস ফাইলটি ব্যবহার করে না। ব্যাচ মোডের ফলাফল অ-ট্যাবুলার আউটপুট ফর্ম্যাট এবং বিশেষ অক্ষরগুলি থেকে বেরিয়ে আসা in কাঁচা মোড ব্যবহার করে পালানো নিষ্ক্রিয় হতে পারে; --raw বিকল্পের বিবরণ দেখুন।

এটি আপনাকে একটি ট্যাব দ্বারা পৃথক করা ফাইল দেবে। যেহেতু কমা (বা কমাযুক্ত স্ট্রিংগুলি) এড়ানো যায় না তাই ডিলিমিটারকে কমাতে পরিবর্তন করা সোজা নয়।


12
এটি একটি পছন্দসই সমাধান: 1) ট্যাব-বিচ্ছিন্ন-মান তালিকাগুলি ইউএনআইএক্সে প্রচলিত 2) টিএসভি আমদানি স্থানীয়ভাবে এক্সেল, ওপেনঅফিস স্প্রেডশিট ইত্যাদি সহ বেশিরভাগ আমদানি সিস্টেমের দ্বারা সমর্থিত হয় 3) পাঠ্য ক্ষেত্রের জন্য উদ্ধৃতি অক্ষরগুলি এড়িয়ে যাওয়ার দরকার নেই 4 ) কমান্ড-লাইন একটি বাতাস রপ্তানি করে
জো টি টি

5
এটিই সেরা সমাধান কারণ
আরডিএসের

8
একটি ঝরঝরে কৌশল: আপনি যদি ট্যাব দ্বারা বিভক্ত ফাইলটিকে .csls পরিবর্তে .xls হিসাবে সংরক্ষণ করেন তবে এটি "টেক্সট টু ডেটা" রূপান্তরের প্রয়োজন ছাড়াই এবং কোনও আঞ্চলিক সেটিংস সমস্যা ছাড়াই এক্সেলের মধ্যে উন্মুক্ত হবে।
সার্বাউট

3
@ জোয়ে টি - আপনার এখনও ট্যাব এবং গাড়ীর রিটার্ন এড়াতে হবে। এছাড়াও যদি কোনও ক্ষেত্রের সামগ্রীটি উদ্ধৃত বা পালানো ক্ষেত্রের মতো লাগে তবে আমদানি করা সামগ্রীটি মূলটির মতো নাও লাগতে পারে।
এমসি 0 ই

2
আপনার NULs নিয়ে সমস্যা হবে .. তারা স্ট্রিং নাল হয়ে বেরিয়ে আসবে ..
জোনাথন

141

এটি করার একটি মোটামুটি gnarly উপায় এখানে। এটি কোথাও খুঁজে পেয়েছে, কোনও creditণ নিতে পারে না

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 /// এর অর্থ প্রথম // এর মধ্যে যা রয়েছে তার সাথে বিকল্প // দ্বিতীয়টির মধ্যে যা আছে //
  • শেষে "জি" হল একটি সংশোধক যার অর্থ "সমস্ত উদাহরণ, কেবল প্রথম নয়"
  • this (এই প্রসঙ্গে) মানে লাইনের শুরু
  • this (এই প্রসঙ্গে) এর অর্থ লাইনের শেষ

সুতরাং, এটি সব একত্রিত:

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
- পতাকাটি আমি ঠিক কী খুঁজছিলাম! ধন্যবাদ!
গৌরব গুপ্ত

1
এই regex সত্যিই বেশ সহজ; এই পৃষ্ঠায় প্রচুর অন্যান্য উত্তর পছন্দ করে, এটি কেবল আউটপুট পরিষ্কার করে mysql -B। যদি আপনি পৃথক লাইনে পৃথক স্টেটমেন্টগুলিতে রেজেক্সকে পৃথক করেন, তবে এটি বোঝা বেশ সহজ (যিনি রেজেক্স জানে তার পক্ষে) বোঝা উচিত।
মেই

7
প্রথম নজরে, এটি দেখতে বেশ নষ্ট হয়ে গেছে। সামগ্রীগুলিতে ট্যাব এবং ক্যারিজের রিটার্নগুলি ভুলভাবে জড়িত হবে। "গুলি / '/ \' /;" মোটেও কিছুই করে না, কারণ শেল কমান্ডের ডাবল উদ্ধৃতিগুলি ব্যাকস্ল্যাশ গ্রাস করে। ব্যাকস্ল্যাশ সহ আরও অনেক অনুরূপ বাগ হারিয়েছে। ডিবি ক্ষেত্রে ব্যাকস্ল্যাশের জন্য কোনও পরিচালনা নেই।
এমসি 0 ই

1
দেখে মনে হচ্ছে এই কমান্ডটি লিনাক্সে ভাল কাজ করে তবে ম্যাকের জন্য নয়
হিমারসন ভারেলা

6
আপনার যদি কোনও পাঠ্য ক্ষেত্র থাকে যাতে ট্যাব, ব্যাকস্ল্যাশ ","এবং অন্যান্য অনেকগুলি জিনিস থাকে তবে এটি ভঙ্গ হবে । একটি রেজেক্স এই সমস্যাটি সমাধান করার উপায় নয়
এইডান

93

কেবল ইউনিক্স / সাইগউইন , এটি 'টিআর' এর মাধ্যমে পাইপ করুন:

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

এনবি: এটি এম্বেড করা কমাগুলি বা এমবেডড ট্যাবগুলি পরিচালনা করে না।


53

এটি আমাকে কয়েকবার বাঁচিয়েছিল। দ্রুত এবং এটি কাজ করে!

--batch কলাম বিভাজক হিসাবে ট্যাব ব্যবহার করে মুদ্রণের ফলাফলগুলি একটি নতুন লাইনের প্রতিটি সারি সহ।

--raw অক্ষর অব্যাহতি অক্ষম করে (\ 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

সম্পূর্ণতার জন্য আপনি সিএসভিতে রূপান্তর করতে পারেন (তবে সাবধান হন কারণ ট্যাবগুলি ক্ষেত্রের মানগুলির মধ্যে থাকতে পারে - যেমন পাঠ্য ক্ষেত্র)

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


4
যতক্ষণ না আমি কিছু মিস করছি, এটি কোনও সিএসভি ফাইল নয়, একটি টিএসভি ফাইল তৈরি করে ...
প্রেসিংঅনলয়েজ

@ প্রেসিংঅনলওয়েস হ্যাঁ মাইএসকিউএল ডকের উদ্ধৃতি: "কলাম বিভাজক হিসাবে ট্যাব ব্যবহার করে ফলাফলগুলি মুদ্রণ করুন, একটি নতুন লাইনের প্রতিটি সারি।" তবে পার্সিং কোনও ডিলিমিটারে সমস্যা হওয়া উচিত নয়। আমি আমার ক্লায়েন্টের জন্য এক্সেল ফাইলগুলি তৈরি করতে এটি ব্যবহার করেছি।
hrvoj3e

39

পল টম্বলিনের দেওয়া আউটফিল সমাধানটি মাইএসকিউএল সার্ভারে নিজেই একটি ফাইল লিখিত হওয়ার কারণ হয়ে থাকে, সুতরাং এটি কেবল তখনই কাজ করবে যদি আপনার কাছে ফাইল অ্যাক্সেস থাকে তবে সেই বাক্স থেকে ফাইলটি পুনরুদ্ধার করার জন্য লগইন অ্যাক্সেস বা অন্য উপায় রয়েছে other

আপনার যদি এইরকম অ্যাক্সেস না থাকে এবং ট্যাব-সীমাবদ্ধ আউটপুট হ'ল সিএসভি-র একটি যুক্তিসঙ্গত বিকল্প (যেমন, যদি আপনার শেষ লক্ষ্যটি এক্সেলের কাছে আমদানি করা হয়), তবে সেরবউটের সমাধান (ব্যবহার mysql --batchএবং and চ্ছিকভাবে --raw) যাওয়ার উপায়।


36

মাইএসকিউএল ওয়ার্কবেঞ্চ সিএসভিতে রেকর্ডসেট রফতানি করতে পারে এবং এটি ক্ষেত্রগুলিতে কমাগুলি খুব ভাল পরিচালনা করে বলে মনে হচ্ছে। সিএসভি ওপেন অফিসে সূক্ষ্মভাবে খোলে।


2
ধন্যবাদ মিলিয়ন ডেভিড ডেটাতে এইচটিএমএল বিষয়বস্তুর জন্য সঠিকভাবে আউটপুটটিতে নতুন লাইনগুলি পাওয়ার জন্য 3 ঘন্টা ব্যয় করার পরে, আমি মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করেছিলাম এবং 2 মিনিটের মধ্যে আমার সিএসভি ফাইল প্রস্তুত হয়ে যায়।
মিঃ-ইউরো

আমি সন্ধান পেয়েছি এটি এক্সএমএল হিসাবেও সংরক্ষণ করতে পারে, যা দুর্দান্ত। আমি এই এক্সএমএলটিকে লক্ষ্য প্রয়োগে আমদানির জন্য উপযুক্ত সিএসভি ফাইলে রূপান্তর করতে এক্সএসএলটি ব্যবহার করে এক অ্যাপ্লিকেশন থেকে অন্যটিতে স্থানান্তরিত হওয়ার আশা করছি।
ডেভিড অলিভার

আমদানি রফতানি বৈশিষ্ট্যের জন্য মাইএসকিএল ওয়ার্কবেঞ্চ সেরা বিকল্প।
সিজগানি

1
আমি মাত্র সাফল্যের সাথে মাইএসকিএল ওয়ার্কবেঞ্চ ব্যবহার করে অর্ধ মিলিয়ন সারি রপ্তানি করেছি যাতে বড় ফাইল কোনও সমস্যা বলে মনে হয় না। আপনাকে আপনার ক্যোয়ারী চালানোর আগে আপনি নির্বাচিত সীমাটি সরিয়েছেন তা নিশ্চিত করতে হবে এবং আপনার my.ini ফাইলে আপনাকে নিম্নলিখিত মানগুলি বাড়িয়ে দিতেও পারে: ম্যাক্স_গ্ল্যাড_প্যাকেট = 500 এম, নেট_ড্রেট_টাইমআউট = 600, নেট_রাইট_টাইমআউট = 600
ভিনসেন্ট

3
মাইএসকিউএল ওয়ার্কবেঞ্চের একটি বিব্রতকর মেমরি ফাঁস হয় যখন সিএসভিতে রফতানির তথ্য থাকে, যদি আপনার 1 বা 2 মিলিয়ন আরও বেশি সারিগুলির মতো একটি বড় ডেটা সেট থাকে তবে 12 জিবি র‌্যাম (আমার লিনাক্স মেশিনে পরীক্ষিত) যথেষ্ট নয় এবং আপনি যদি না স্মৃতি মেমরি ক্লিয়ার না করেন তবে হত্যা বা বন্ধ করুন। বড় ডেটা সেট করার জন্য এটি কোনও সমাধান নয়।
ওস্টিকো

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
এটি ফাঁকা স্থান সহ ক্ষেত্রের মানগুলির জন্য ব্যর্থ।
বরুণ শর্মা

29

মাইএসকিউএল ওয়ার্কবেঞ্চটি ব্যতীত এখানে আজ অবধি সমস্ত সমাধান মাইএসকিএল ডিবি-তে অন্তত কিছু সম্ভাব্য সামগ্রীর জন্য ভুল এবং যথেষ্ট সম্ভবত অনিরাপদ (অর্থাত্ সুরক্ষা সমস্যা) are

এমওয়াইএসকিউএল ওয়ার্কবেঞ্চ (এবং একইভাবে পিএইচপিএমইএডমিন) একটি আনুষ্ঠানিকভাবে সঠিক সমাধান সরবরাহ করে তবে ব্যবহারকারীর অবস্থানে আউটপুট ডাউনলোড করার জন্য ডিজাইন করা হয়েছে। স্বয়ংক্রিয়ভাবে ডেটা রফতানির মতো জিনিসের জন্য এগুলি এত কার্যকর নয়।

এর আউটপুট থেকে নির্ভরযোগ্যভাবে সঠিক সিএসভি উত্পন্ন করা সম্ভব নয় mysql -B -e 'SELECT ...' কারণ এটি ক্যারেজ রিটার্ন এবং ক্ষেত্রগুলিতে সাদা স্থানকে এনকোড করতে পারে না। মাইএসকিএল-তে '-s' পতাকাটি ব্যাকস্ল্যাশ থেকে বেরিয়ে আসা করতে পারে এবং সঠিক সমাধানের দিকে নিয়ে যেতে পারে। তবে, একটি স্ক্রিপ্টিং ভাষা ব্যবহার করা (শালীন অভ্যন্তরীণ ডেটা স্ট্রাকচার সহ একটি যা বাশ নয়) এবং যে লাইব্রেরিগুলি ইতিমধ্যে সতর্কতার সাথে এনকোডিংয়ের কাজ করা হয়েছে তা নিরাপদ।

আমি এটির জন্য একটি স্ক্রিপ্ট লেখার কথা ভেবেছিলাম, তবে আমি এটি কী বলব তা চিন্তা করার সাথে সাথে একই নামেই পূর্ব-বিদ্যমান কাজটি অনুসন্ধান করার বিষয়টি আমার কাছে ঘটেছিল। যদিও আমি এটিকে পুরোপুরি অতিক্রম করিনি, https://github.com/robmiller/mysql2csv এ সমাধানটি আশাব্যঞ্জক মনে হচ্ছে। আপনার আবেদনের উপর নির্ভর করে, এসকিউএল আদেশগুলি নির্দিষ্ট করার জন্য ইয়ামল পদ্ধতিটি সম্ভবত আবেদন করতে পারে বা নাও পারে। আমার উবুন্টু 12.04 ল্যাপটপ বা ডেবিয়ান স্কিজ সার্ভারের সাথে মানক হিসাবে মানক হিসাবে রুবি এর আরও সাম্প্রতিক সংস্করণের প্রয়োজনীয়তা নিয়ে আমি খুব শিহরিতও নই। হ্যাঁ আমি জানি আমি আরভিএম ব্যবহার করতে পারি, তবে আমি এটিকে কোনও সাধারণ উদ্দেশ্যে এটি রক্ষণ করি না।

আশা করা যায় যে কেউ একটি উপযুক্ত সরঞ্জাম চিহ্নিত করবে, তার কিছুটা পরীক্ষা হয়েছিল। অন্যথায় আমি সম্ভবত এটি আপডেট করব যখন আমি একটি খুঁজে পাই বা লিখি।


1
আপনি ঠিক বলেছেন, টেবিলের জটিল স্ট্রিংগুলির জন্য আপনাকে কেবল বাশ নয়, কিছু শালীন গ্রন্থাগার ব্যবহার করতে হবে। আমি মনে করি নোডেজের এই ধরণের ক্রিয়াগুলির জন্য আরও ভাল সমাধান রয়েছে। এই উদাহরণটি পছন্দ করুন
ইয়েয়া

1
হাই, ভাল উত্তর, আমি স্ট্যাকওভারফ্লো.com/ a/ 35123787 / 1504300 এর নীচে প্রস্তাবিত অজগর সমাধানটিতে একটি লিঙ্ক যুক্ত করব , যা ভাল কাজ করে এবং খুব সহজ। আমি আপনার পোস্ট সম্পাদনা করার চেষ্টা করেছি কিন্তু সম্পাদনাটি প্রত্যাখ্যান করা হয়েছে
সত্যই চমৎকার

26

এই পৃষ্ঠার উত্তরগুলির অনেকগুলি দুর্বল কারণ তারা সিএসভি ফর্ম্যাটে কী ঘটতে পারে তার সাধারণ ক্ষেত্রে পরিচালনা করে না। যেমন ক্ষেত্র এবং অন্যান্য অবস্থার মধ্যে এম্বেড কমা এবং কোটস যা সর্বদা শেষ পর্যন্ত আসে। আমাদের একটি সাধারণ সমাধান দরকার যা সমস্ত বৈধ সিএসভি ইনপুট ডেটার জন্য কাজ করে।

পাইথনের একটি সহজ ও শক্ত সমাধান এখানে:

#!/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 আপনার মন্তব্য পরিপূর্ণ করার জন্য
বেন

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*

ক্রেডিট: আমাজন আরডিএস থেকে সিএসভি ফাইলে টেবিল রফতানি করা


একটি পাগল oneliner thats। হ্যাটসফ
এলিয়াস

17
  1. যুক্তি:

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

আপনি যখন কোনও সিএসভি টেবিল তৈরি করেন, সার্ভারটি ডাটাবেস ডিরেক্টরিতে একটি সারণী বিন্যাস ফাইল তৈরি করে। ফাইলটি টেবিলের নাম দিয়ে শুরু হয় এবং একটি .frm এক্সটেনশান রয়েছে। স্টোরেজ ইঞ্জিন একটি ডেটা ফাইলও তৈরি করে। এর নামটি টেবিলের নাম দিয়ে শুরু হয় এবং একটি। CSV এক্সটেনশান রয়েছে। ডেটা ফাইলটি একটি সরল পাঠ্য ফাইল। আপনি যখন টেবিলের মধ্যে ডেটা সঞ্চয় করেন, স্টোরেজ ইঞ্জিন এটিকে কমা-বিচ্ছিন্ন মান বিন্যাসে ডেটা ফাইলে সংরক্ষণ করে।


1
অন্য যে কোনও অ্যাডজাস্টমেন্টের প্রয়োজন ছাড়াই এটি সঠিক।
অ্যান্ড্রু শুলম্যান

13

এই উত্তরটি পাইথন এবং একটি জনপ্রিয় তৃতীয় পক্ষের লাইব্রেরি, পাইমাইএসকিউএল ব্যবহার করে । আমি এটি যুক্ত করছি কারণ পাইথনের সিএসভি লাইব্রেরি বিভিন্ন ধরণের স্বাদগুলি সঠিকভাবে পরিচালনা করতে যথেষ্ট শক্তিশালী .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
@ আলেকজান্ডার বাল্টাসার, ঠিক আছে, এবং এটি দরকারী মনে হচ্ছে, তবে এটি ডাটাবেসের সাথে ইন্টারঅ্যাক্ট করার জন্য পাইথন কোড ব্যবহার করছে না। এই প্রশ্নে মন্তব্য দেখুন।
বেন

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

উপরের উত্তরের বিকল্প হিসাবে, আপনার কাছে একটি মাইএসকিউএল টেবিল থাকতে পারে যা সিএসভি ইঞ্জিন ব্যবহার করে।

তারপরে আপনার হার্ড ডিস্কে একটি ফাইল থাকবে যা সর্বদা সিএসভি ফর্ম্যাটে থাকবে যা আপনি এটি প্রক্রিয়া না করেই অনুলিপি করতে পারবেন।


1
ফাইল আকার / লেখার / পড়া / ইত্যাদি ক্ষেত্রে এর সীমা কত?
জাচ স্মিথ

8

পূর্ববর্তী উত্তরগুলিতে প্রসারিত করতে, নিম্নলিখিত এক-লাইনার একটি ট্যাব-বিচ্ছিন্ন ফাইল হিসাবে একক টেবিল রফতানি করে। এটি অটোমেশনের জন্য উপযুক্ত, প্রতিদিন বা আরও কিছু ডাটাবেস রফতানি করার জন্য।

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    

4
সিএসভিতে রূপান্তর করতে:mysql -B -D mydatabase -e 'select * from mytable' | sed -e 's/\t/,/g'
ডিএসিমন

7
ব্যবহার sed -e 's/\t/,/g'কেবলমাত্র নিরাপদ যদি আপনি নিশ্চিত হন যে আপনার ডেটাতে কোনও কমা বা ট্যাব নেই।
আগত

7

ব্যবহারকারী 7610 এ বিল্ডিং, এটি করার সর্বোত্তম উপায় is 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
সুন্দর, পরিষ্কার এবং দ্রুত কাজ করে - আপনি যদি সেই পরিবেশে পিএইচপি চালাতে পারেন তবে এটি দুর্দান্ত সমাধান!
জন ফিয়ালা 22

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

পার্ল স্ক্রিপ্ট (অন্য কোথাও থেকে স্নিপড) ট্যাব ব্যবধানযুক্ত ক্ষেত্রগুলি সিএসভিতে রূপান্তর করার একটি দুর্দান্ত কাজ করে।


এটা অসাধারণ. সামান্য উন্নতি হতে পারে সংখ্যা ব্যতীত সমস্ত কিছু উদ্ধৃত করা perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '- আপনার উদ্ধৃতি দেওয়া হবে না1.2.3
আর্টফুলবোট

5

ঠিক কোনও সিএসভি ফর্ম্যাট হিসাবে নয়, তবে মাইএসকিউএল ক্লায়েন্টের teeআদেশটি স্থানীয় ফাইলে আউটপুট সংরক্ষণ করতে ব্যবহার করা যেতে পারে :

tee foobar.txt
SELECT foo FROM bar;

আপনি এটি ব্যবহার করে অক্ষম করতে পারেন notee

সমস্যাটি SELECT … INTO OUTFILE …;হ'ল এটির সার্ভারে ফাইলগুলি লেখার অনুমতি প্রয়োজন।


.Csv এক্সটেনশনটি .txt এর পরিবর্তে ব্যবহার করা হয়, তবে কি সচেতন হওয়ার জন্য কোনও বিন্যাস সংক্রান্ত সমস্যা আছে?
ড্যাটালিফেনিক

@myidealab বিন্যাস সম্পর্কিত সমস্যাগুলি কমা ইত্যাদি থেকে উদ্ভূত হয় না escaped সিএসভি হ'ল একটি সরল পাঠ্য বিন্যাস, সুতরাং কেবল এক্সটেনশানটি অদলবদল করা থেকে কোনও বিন্যাসের সমস্যা নেই।
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

আপনার যদি সার্ভারে পিএইচপি সেট আপ থাকে তবে আপনি অ্যাবসেটরিয়াল মাইএসকিএল কোয়েরির জন্য একটি (প্রকৃত বৈধ) সিএসভি ফাইল রপ্তানি করতে mysql2csv ব্যবহার করতে পারেন । দেখুন নির্বাচন * এমনটা 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

(গিস্টের বিষয়বস্তু ডাউনলোড করুন, চেকসাম দেখুন এবং এটি সম্পাদনযোগ্য করুন)।


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

এই থ্রেডের কোনও সমাধানই আমার বিশেষ কেসের জন্য কাজ করে নি, আমার কাছে একটি কলামের ভিতরে জসন ডেটা ছিল, যা আমার সিএসভি আউটপুটটিতে বিভ্রান্ত হবে। একই সমস্যাযুক্তদের জন্য, পরিবর্তে lines 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';

কাজ করছে না, আপনাকে \কোয়েরি থেকে /(ফরওয়ার্ডস্প্ল্যাশ) পরিবর্তন করতে হবে

এবং যে কাজ করে !!

উদাহরণ:

আউটফিল 'সি: / প্রোগ্রামডেটা / মাইএসকিউএল / মাইএসকিউএল সার্ভার 8.0 / আপলোড / ফাইলনাম.সিএসভি'র' ফিল্ডস টার্মিনেটেড বাই ',' এনলজড বাই বাই '"' লাইনগুলি 'M n' এর মাধ্যমে অন্তর্ভুক্ত থেকে * উপস্থিতি নির্বাচন করুন;

প্রতিটিবার যখন আপনি সফল ক্যোয়ারি চালাবেন, এটি প্রতিটিবার নতুন সিএসভি ফাইল তৈরি করবে! ঠিক কুল?


1

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

নিম্নলিখিত বাশ স্ক্রিপ্টটি আমার পক্ষে কাজ করে। এটি allyচ্ছিকভাবে অনুরোধ করা সারণীগুলির জন্যও স্কিমা পায়।

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

আমি একই সমস্যার মুখোমুখি হয়েছি এবং পল এর উত্তর কোনও বিকল্প ছিল না কারণ এটি আরডিএস ছিল। কমাগুলি দিয়ে ট্যাবটি প্রতিস্থাপন করা কার্যকর হয়নি কারণ ডেটাতে কমা ও ট্যাব এম্বেড করা ছিল। আমি দেখেছি যে মাইকিলি যা মাইএসকিএল -ক্লায়েন্টের জন্য একটি ড্রপ-ইন বিকল্প, --csvপতাকা সহ বাক্সের বাইরে সিএসভি আউটপুট সমর্থন করে

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

1

আপনি নিজের ফাইলটি রফতানি করার চেষ্টা করার সময় আপনি যদি এই ত্রুটিটি পেয়ে থাকেন

ত্রুটি 1290 (HY000): মাইএসকিউএল সার্ভারটি --secure-file-ખાનગીকরণ বিকল্পের সাথে চলছে তাই এটি এই বিবৃতিটি কার্যকর করতে পারে না

এবং আপনি এই ত্রুটিটি সমাধান করতে সক্ষম নন। এই অজগর স্ক্রিপ্টটি খালি চালিয়ে আপনি একটি কাজ করতে পারেন

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-ini path/to/php.ini your-script.php

আমি অন্তর্ভুক্ত করছি --php-ini স্যুইচটি , কারণ আপনার নিজের পিএইচপি কনফিগারেশনটি ব্যবহার করতে হতে পারে যা মাইএসকিউএল এক্সটেনশন সক্ষম করে। পিএইচপি 5.3.0+ এ যে এক্সটেনশানটি ডিফল্টরূপে সক্ষম হয়, তাই এটি সক্ষম করার জন্য কনফিগারেশনটি আর ব্যবহার করার প্রয়োজন হয় না।

তারপরে আপনি আপনার রফতানি স্ক্রিপ্টটি কোনও সাধারণ পিএইচপি স্ক্রিপ্টের মতো লিখতে পারেন:

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

এই পদ্ধতির সুবিধাটি হ'ল, এতে ভারচর এবং পাঠ্য ক্ষেত্রগুলির কোনও সমস্যা নেই, এতে নিউলাইন রয়েছে এমন পাঠ্য রয়েছে। এই ক্ষেত্রগুলি সঠিকভাবে উদ্ধৃত হয়েছে এবং সেগুলির মধ্যে থাকা নতুন লাইনগুলি CSV পাঠক পাঠকের অংশ হিসাবে ব্যাখ্যা করবে, রেকর্ড পৃথককারী নয়। এটি এমন কিছু যা পরে সেড বা আরও কিছু দিয়ে সংশোধন করা শক্ত ।


1
অহেতুক জটিল হওয়ার থেকে দূরে, এখানে কেবলমাত্র এটিই সমাধান যা সম্ভবত সঠিক হতে পারে এমন দিক নিয়ে চলেছে - যদিও আরও কিছুটা কাজ করেও। সিএসভি প্রথম প্রদর্শিত হওয়ার চেয়ে জটিল এবং আপনি বিভিন্ন ধরণের ভুল করেছেন। যেমন আসল ব্যাকস্ল্যাশ। সিএসভিতে লেখার জন্য সমস্ত বিষয় নিয়ে কাজ করে এমন একটি লাইব্রেরি ব্যবহার করা আরও ভাল।
এমসি 0 ই

@ এমসি0e সাধারণত আপনি হয় দ্বিগুণ হন বা উদ্ধৃতিটি এড়িয়ে যান। আমি উদ্ধৃতি দ্বিগুণ করার সিদ্ধান্ত নিয়েছি, সুতরাং আমার পালানোর চরিত্রের দরকার নেই। সিএসভি বিবরণ সম্পর্কে বিভিন্ন সফ্টওয়্যারের বিভিন্ন ধারণা রয়েছে। উদাহরণস্বরূপ, মাইএসকিউএল-এ থাকা লোড ডেটা প্রকৃতপক্ষে escape পালানোর চরিত্র হিসাবে বিবেচনা করে, যেখানে ওপেন অফিস ক্যালক না করে। আমি যখন উত্তরটি লিখেছিলাম তখন আমি স্প্রেডশিটে ডেটা রফতানি করে যাচ্ছিলাম।
ব্যবহারকারী 7610

1
আমার কোডটি আমার ডেটাসেটটি পুনরায় রফতানি করার জন্য প্রয়োজনীয় সমস্ত কিছু পরিচালনা করে ;) আপনার উত্তরটিও সঠিক দিকের একটি পদক্ষেপ, তবে সেখানে প্রথম মন্তব্য হিসাবে বলা হয়েছে, এটি 1) স্ক্রিপ্ট থেকে সরাসরি স্কেল ডাটাবেসের সাথে সংযুক্ত হতে হবে পাশাপাশি 2) একটি উপযুক্ত সিএসভি লাইব্রেরি ব্যবহার করুন।
ব্যবহারকারী 7610
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.