CSV ආකෘතියෙන් MySQL විමසුම් ප්‍රති results ල ප්‍රතිදානය කරන්නේ කෙසේද?


1196

ලිනක්ස් විධාන රේඛාවෙන් MySQL විමසුමක් ක්‍රියාත්මක කර CSV ආකෘතියෙන් ප්‍රති output ල ලබා ගැනීමට පහසු ක්‍රමයක් තිබේද?

මෙන්න මම දැන් කරන්නේ:

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

උපුටා දැක්වීම් වලින් වට කළ යුතු තීරු විශාල ප්‍රමාණයක් ඇති විට හෝ එයින් ගැලවීමට අවශ්‍ය ප්‍රති results ලවල උපුටා දැක්වීම් තිබේ නම් එය අවුල් සහගත වේ.


1
REPLACE()උපුටා දැක්වීම් වලින් ගැලවීමට ඔබට ඔබේ විමසුමේ භාවිතා කළ හැකිය .
dsm

[මෙම stackoverflow] හි මගේ පිළිතුර බලන්න [1] [1]: stackoverflow.com/questions/12242772/…
biniam


2
මෙම stackoverflow ප්‍රශ්නයට පිළිගත් පිළිතුර බොහෝ විට හොඳම ක්‍රමය වේ: stackoverflow.com/questions/3760631/mysql-delimiter-question
සැමුවෙල්

මම මාරියා ඩීබී දෝෂ ට්රැකර් ( jira.mariadb.org/browse/MDEV-12879 ) හි විශේෂාංග ඉල්ලීමක් ලිවීය. ඔබට එයට ඡන්දය දිය හැකිය.
ජැරඩ් බෙක්

Answers:


1783

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 ක්‍රියාවලිය යටතේ ක්‍රියාත්මක වන පරිශීලකයාට තෝරාගත් නාමාවලියට ලිවීමට අවසර තිබිය යුතුය, නැතහොත් විධානය අසාර්ථක වනු ඇත.

දුරස්ථ සේවාදායකයකින් (විශේෂයෙන් හෙරොකු හෝ ඇමේසන් ආර්ඩීඑස් වැනි සත්කාරක හෝ අථත්‍යකරණ යන්ත්‍රයක්) ඔබේ දේශීය යන්ත්‍රයට ප්‍රතිදානය ලිවීමට ඔබට අවශ්‍ය නම්, මෙම විසඳුම සුදුසු නොවේ.


16
Oma තෝමස් ඔබට දුරස්ථ ගොනු පද්ධතියකට සහ MySQL වෙත ප්‍රවේශය ඇත්නම්, ඔබට කොතැනක හෝ ලිවීමට හැකි විය යුතුය. / tmp වෙනුවට, /home/yourusername/file.csv උත්සාහ කරන්න - එය අසමත් වුවහොත් සහ ප්‍රති set ල කට්ටලය එතරම් විශාල නොවේ නම්, ඔබට ඔබේ SSH සේවාදායකයා වෙතින් ප්‍රතිදානය පිටපත් කර ඔබේ දේශීය යන්ත්‍රයට ඇලවිය හැකිය.
මයිකල් බට්ලර්

64
ප්‍රශ්නය නිශ්චිතව දක්වා ඇත්තේ MySQL මිස “ප්‍රමිතීන්ට අනුකූල නොවේ”.
පෝල් ටොම්බ්ලින්

36
ශීර්ෂය ද ඇතුළත් කරන්නේ කෙසේද?
බොග්ඩන් ගුසීව්

66
Og බොග්ඩාන් ගුසීව්, සත්‍ය විමසුමට පෙර "SELECT 'order_id', 'product_name', 'qty' UNION" සකස් කිරීමෙන් ඔබට ශීර්ෂකය ඇතුළත් කළ හැකිය. පළමුව තෝරාගත් විමසුම ප්‍රතිලාභ ශීර්ෂය, දෙවන විමසුම සත්‍ය දත්ත ලබා දෙයි; UNION එය එකට එකතු කරයි.
petrkotek

19
Ic මයිකල් බට්ලර්: හොඳයි, නැහැ. ඔබ ඇමේසන් ආර්ඩීඑස්, හෙරොකු හෝ වෙනත් සත්කාරක විසඳුමක් භාවිතා කරන්නේ නම්, ඔබට වෙනත් කෙනෙකුගේ සේවාදායකයකට ලිවීමට නොහැකි වනු ඇත.
කෙන් කින්ඩර්

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

ටැබ් වෙන් කර ඇති. සැබෑ CSV එකක් ලබා ගැනීම සඳහා එය එලෙස නල කරන්න (ස්තූතියි heretherefromhere):

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

5
එපමණක් නොව, දේශීය ගොනු පද්ධතියට ලිවීමේ අනෙක් ඒවාට වඩා දුරස්ථ දත්ත සමුදා ධාරකයකින් අන්තර්ගතය නිර්මාණය කිරීමට එය ඉඩ දෙයි.
tmarthal

32
එය ටැබ් වලින් වෙන් කර ඇත, කොමාවෙන් වෙන් කර නැත.
Flimm

13
Li ෆ්ලිම්, ඔබ සතුව ක්ෂේත්‍රවල කොමා / ටැබ් නොමැති බව උපකල්පනය කර ප්‍රති result ලය නල මාර්ගයෙන් පරිවර්තනය කළ හැකිය| sed 's/\t/,/g'
ජෝන් කාටර්

112
තෝරාගත් ඕනෑම දත්තයක දිස්වන කොමාව සඳහා sed 'fix' මගින් වන්දි ලබා නොදෙන අතර ඒ අනුව ප්‍රතිදානය කරන ලද ඔබේ තීරු මඟ හැරෙනු ඇත
Joey T

15
සෘණාත්මකභාවය වලංගු වේ .. එය දැන් ඔබට වැඩ කළ හැකි නමුත් අනාගතයේදී ඔබේ දත්ත ටැබ් එකක් හෝ කොමාවක් ඇතුළත් වන විට එය ඔබට දෂ්ට කළ හැකිය.
ජෝන් හන්ට්

205

mysql --batch, -B

තීරු බෙදුම්කරු ලෙස ටැබ් භාවිතා කරමින් ප්‍රති results ල මුද්‍රණය කරන්න, එක් එක් පේළිය නව පේළියක. මෙම විකල්පය සමඟ, mysql ඉතිහාස ගොනුව භාවිතා නොකරයි. කණ්ඩායම් මාදිලියේ ප්‍රති results ලය වන්නේ වගුගත නොවන නිමැවුම් ආකෘතිය සහ විශේෂ අක්ෂර වලින් ගැලවීමයි. අමු මාදිලිය භාවිතා කිරීමෙන් පැන යාම අක්‍රිය කළ හැකිය; --raw විකල්පය සඳහා විස්තරය බලන්න.

මෙය ඔබට ටැබ් වෙන් කළ ගොනුවක් ලබා දෙනු ඇත. කොමාව (හෝ කොමාව අඩංගු නූල්) ගැලවී නොයන බැවින් පරිසීමකය කොමාව ලෙස වෙනස් කිරීම සරල නැත.


12
මෙය වඩාත් සුදුසු විසඳුමකි: 1) ටැබ් වෙන් කරන ලද අගය ලැයිස්තු යුනික්ස් 2 හි සුලභ වේ 2) එක්සෙල්, ඕපන් ඔෆිස් පැතුරුම්පත් ඇතුළු බොහෝ ආනයන පද්ධති මගින් ටීඑස්වී ආනයන සඳහා ස්වදේශීය සහාය ලැබේ. 3) පෙළ ක්ෂේත්‍ර සඳහා උපුටා දැක්වීමේ අක්ෂර වලින් ගැලවීමට අවශ්‍ය නැත 4 ) විධාන රේඛා අපනයනය සුළඟක් බවට පත් කරයි
ජෝයි ටී

5
මෙය හොඳම විසඳුම වන්නේ පළමු මෙන් නොව RDS වැනි සේවාදායකයන් සඳහා අවසර අවශ්‍ය නොවන බැවිනි
Muayyad Alsadi

8
පිළිවෙලට උපක්‍රමයක්: ඔබ ටැබ් වලින් වෙන් කරන ලද ගොනුව .csv වෙනුවට .xls ලෙස සුරකිනවා නම්, එය “ටෙක්ස්ට් ටු ඩේටා” පරිවර්තනයකින් තොරව සහ කලාපීය සැකසුම් ගැටළු නොමැතිව එක්සෙල් ලෙස විවෘත වේ.
serbaut

3
Oe ජෝයි ටී - ඔබට තවමත් ටැබ් සහ කරත්ත ආපසු පැමිණිය යුතුය. ක්ෂේත්‍රයක අන්තර්ගතය උපුටා ගත් හෝ ගැලවී ගිය ක්ෂේත්‍රයක් සේ පෙනේ නම්, ආනයනය කළ අන්තර්ගතය මුල් පිටපත මෙන් නොවිය හැකිය.
mc0e

2
ඔබට NULLs සමඟ ගැටළුවක් ඇති වේ .. ඒවා නූල් ශුන්‍ය ලෙස එළියට එනු ඇත ..
ජොනතන්

145

මෙන්න එය තරමක් අශෝභන ක්‍රමයක්. එය කොතැනක හෝ හමු විය, කිසිදු ණයක් ලබා ගත නොහැක

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 පැහැදිලි කිරීම:

  • s /// යන්නෙන් අදහස් කරන්නේ පළමු // අතර ඇති දේ දෙවන // අතර ඇති දේ සමඟ ආදේශ කරන්න
  • අවසානයේ “g” යනු නවීකරණයක් වන අතර එහි අර්ථය “සියලු අවස්ථාවන්, පළමුව පමණක් නොවේ”
  • context (මෙම සන්දර්භය තුළ) යන්නෙන් අදහස් කරන්නේ රේඛාවේ ආරම්භයයි
  • context (මෙම සන්දර්භය තුළ) යන්නෙන් අදහස් කරන්නේ රේඛාවේ අවසානයයි

එබැවින්, සියල්ල එකට දමා:

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. ඔබ රීජෙක්ස් වෙනම රේඛාවලින් තනි ප්‍රකාශවලට වෙන් කළහොත් එය තේරුම් ගැනීම තරමක් සරල වනු ඇත (රීජෙක්ස් දන්නා අයෙකුට).
Mei

7
බැලූ බැල්මට මෙය බිඳී ඇති බවක් පෙනේ. ටැබ් සහ අන්තර්ගතයේ ප්‍රවාහනය වැරදි ලෙස හසුරුවනු ලැබේ. "s / '/ \' /;" කිසිසේත් කිසිවක් නොකරයි, මන්ද ෂෙල් විධානයෙහි ද්විත්ව උපුටා දැක්වීම් බැක්ස්ලෑෂ් පරිභෝජනය කරයි. බැක්ස්ලෑෂ් නැතිවීමත් සමඟ තවත් බොහෝ සමාන දෝෂ. Db ක්ෂේත්‍රයේ බැක්ස්ලෑෂ් සඳහා හැසිරවීමක් නොමැත.
mc0e

1
මෙම විධානය ලිනක්ස් හි හොඳින් ක්‍රියාත්මක වන බව පෙනේ, නමුත් මැක්
හෙමර්සන් වරෙලා

7
ඔබට ටැබ්, බැක්ස්ලෑෂ් ","සහ තවත් බොහෝ දේ අඩංගු පෙළ ක්ෂේත්‍රයක් තිබේ නම් මෙය බිඳී යනු ඇත . ඒ regex වේ නොහැකි , මෙම ගැටලුව විසඳීම සඳහා මාර්ගය
aidan

94

යුනික්ස් / සිග්වින් පමණි, එය 'tr' හරහා නල කරන්න:

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

සැ.යු: මෙය කාවැද්දූ කොමාව හෝ කාවැද්දූ ටැබ් හසුරුවන්නේ නැත.


53

මේකෙන් මට කිහිප වතාවක් බේරුණා. වේගවත් හා එය ක්රියා කරයි!

--batch තීරු බෙදුම්කරු ලෙස ටැබ් භාවිතා කරමින් ප්‍රති results ල මුද්‍රණය කරන්න , සෑම පේළියක්ම නව පේළියක ඇත.

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

සම්පූර්ණත්වය සඳහා ඔබට csv බවට පරිවර්තනය කළ හැකිය (නමුත් ටැබ් ක්ෂේත්‍ර අගයන් තුළ විය හැකි බැවින් ප්‍රවේශම් වන්න - උදා: පෙළ ක්ෂේත්‍ර)

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


4
මට යමක් මග හැරී නොමැති නම්, මෙය TSV ගොනුවක් නිර්මාණය කරයි, CSV ගොනුවක් නොවේ ...
PressingOnAlways

@PressingOnAlways ඔව්. MySQL doc quote: "තීරු බෙදුම්කරු ලෙස ටැබ් භාවිතා කරමින් ප්‍රති results ල මුද්‍රණය කරන්න, එක් එක් පේළිය නව පේළියක ඇත." නමුත් විග්‍රහ කිරීම කිසිදු පරිසීමකයකු සමඟ ගැටළුවක් නොවිය යුතුය. මගේ සේවාදායකයා සඳහා එක්සෙල් ලිපිගොනු සෑදීමට මම එය භාවිතා කළෙමි.
hrvoj3e

39

පෝල් ටොම්බ්ලින් විසින් ලබා දුන් OUTFILE විසඳුම MySQL සේවාදායකයේම ගොනුවක් ලිවීමට හේතු වේ, එබැවින් මෙය ක්‍රියාත්මක වන්නේ ඔබට FILE ප්‍රවේශය තිබේ නම් පමණක් නොව, එම කොටුවෙන් ගොනුව ලබා ගැනීම සඳහා ප්‍රවේශවීමේ ප්‍රවේශය හෝ වෙනත් ක්‍රම තිබේ නම් පමණි.

ඔබට එවැනි ප්‍රවේශයක් නොමැති නම් සහ ටැබ් වලින් වෙන් කරන ලද ප්‍රතිදානය CSV සඳහා සාධාරණ ආදේශකයක් වේ (උදා: ඔබේ අවසාන ඉලක්කය එක්සෙල් වෙත ආනයනය කිරීම නම්), එවිට සර්බොට්ගේ විසඳුම (භාවිතා කිරීම mysql --batchසහ විකල්ප වශයෙන් --raw) යා යුතු මාර්ගයයි.


36

MySQL Workbench හට CSV වෙත වාර්තා කට්ටල අපනයනය කළ හැකි අතර, එය ක්ෂේත්‍රවල කොමාව ඉතා හොඳින් හසුරුවයි. CSV OpenOffice දඩයෙන් විවෘත වේ.


2
මිලියනයකට ස්තූතියි ඩේවිඩ්. දත්තවල ඇති HTML අන්තර්ගතයන් සඳහා නව රේඛා නිසියාකාරව ප්‍රතිදානය කිරීමට පැය 3 ක් ගත කිරීමෙන් පසු, මම MySQL Workbench භාවිතා කළ අතර මිනිත්තු 2 කින් මගේ CSV ගොනුව සූදානම් කර ඇත.
mr-ero

මට එය XML ලෙස සුරැකිය හැකි බව සොයාගෙන ඇත, එය විශිෂ්ටයි. මෙම XML ඉලක්කගත යෙදුමට ආනයනය කිරීමට සුදුසු CSV ගොනුවක් බවට පරිවර්තනය කිරීම සඳහා XSLT භාවිතා කරමින් එක් යෙදුමකින් තවත් යෙදුමකට සංක්‍රමණය වීමට මම බලාපොරොත්තු වෙමි.
ඩේවිඩ් ඔලිවර්

ආනයන අපනයන විශේෂාංගය සඳහා mysql workbench හොඳම විකල්පයයි.
cijagani

1
මම MySQL workbench භාවිතා කරමින් පේළි මිලියන භාගයකට වඩා සාර්ථකව අපනයනය කළ නිසා විශාල ලිපිගොනු ගැටලුවක් ලෙස නොපෙනේ. ඔබේ විමසුම ක්‍රියාත්මක කිරීමට පෙර තෝරාගත් සීමාව ඉවත් කිරීමට ඔබ වග බලා ගත යුතු අතර ඔබේ my.ini ගොනුවේ පහත සඳහන් අගයන් වැඩි කිරීමටද ඔබට සිදුවේ: max_allowed_packet = 500M, net_read_timeout = 600, net_write_timeout = 600
වින්සන්ට්

3
CSV හි දත්ත අපනයනය කිරීමේදී MySQL වැඩ බංකුවට අපහසු මතක කාන්දුවක් ඇත, ඔබට තවත් පේළි මිලියන 1 ක් හෝ 2 ක් වැනි විශාල දත්ත කට්ටලයක් තිබේ නම්, 12 GB RAM (මගේ ලිනක්ස් යන්ත්‍රයෙන් පරීක්ෂා කර ඇත) ප්‍රමාණවත් නොවන අතර ඔබ හැරෙන්නට මතකය නිෂ්කාශනය නොවේ. මරන්න හෝ නවත්වන්න. විශාල දත්ත කට්ටලයක් සඳහා මෙය විසඳුමක් නොවේ.
ඔස්ටිකෝ

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
අවකාශයන් සහිත ක්ෂේත්‍ර අගයන් සඳහා මෙය අසමත් වේ.
බාරුන් ෂර්මා

31

MySQL වැඩ බංකුව හැරුණු විට මේ දක්වා ඇති සියලුම විසඳුම් වැරදියි සහ අවම වශයෙන් mysql db හි ඇති විය හැකි අන්තර්ගතයන් සඳහා අනාරක්ෂිත ය (එනම් ආරක්ෂක ගැටළු).

MYSQL Workbench (හා ඒ හා සමානව PHPMyAdmin) විධිමත් නිවැරදි විසඳුමක් සපයන නමුත් ප්‍රතිදානය පරිශීලකයාගේ ස්ථානයට බාගත කිරීම සඳහා නිර්මාණය කර ඇත. දත්ත අපනයනය ස්වයංක්‍රීය කිරීම වැනි දේ සඳහා ඒවා එතරම් ප්‍රයෝජනවත් නොවේ.

නිමැවුමෙන් විශ්වසනීයව නිවැරදි csv උත්පාදනය mysql -B -e 'SELECT ...'කළ නොහැක්කේ එයට ප්‍රවාහණ ප්‍රතිලාභ සහ ක්ෂේත්‍රවල සුදු අවකාශය සංකේතවත් කළ නොහැකි බැවිනි. MySQL වෙත '-s' ධජය බැක්ස්ලෑෂ් ගැලවී යාමක් සිදු කරන අතර එය නිවැරදි විසඳුමකට මඟ පෑදිය හැකිය. කෙසේ වෙතත්, ස්ක්‍රිප්ටින් භාෂාවක් භාවිතා කිරීම (හොඳ අභ්‍යන්තර දත්ත ව්‍යුහයක් ඇති, එය බාෂ් නොවේ), සහ කේතීකරණ ගැටළු දැනටමත් ප්‍රවේශමෙන් සකස් කර ඇති පුස්තකාල භාවිතා කිරීම වඩා ආරක්ෂිත වේ.

මම මේ සඳහා පිටපතක් ලිවීම ගැන සිතුවෙමි, නමුත් මා එය හඳුන්වන්නේ කුමක් දැයි සිතූ විගසම, එම නමින්ම පෙර පැවති කෘති සෙවීම මට සිදුවිය. මම එය තරයේ පසු කර නොමැති අතර, https://github.com/robmiller/mysql2csv හි විසඳුම යහපත් බව පෙනේ. ඔබගේ යෙදුම මත පදනම්ව, SQL විධානයන් නියම කිරීම සඳහා yaml ප්‍රවේශය අභියාචනයක් හෝ නොතිබිය හැකිය. මගේ උබුන්ටු 12.04 ලැප්ටොප් හෝ ඩෙබියන් මිරිකන සේවාදායකයන් සමඟ සම්මතයට වඩා මෑත කාලීන රූබී සංස්කරණයක් සඳහා වන අවශ්‍යතාව ගැන මම සතුටු නොවෙමි. ඔව්, මට RVM භාවිතා කළ හැකි බව මම දනිමි, නමුත් මම එතරම් සරල අරමුණක් සඳහා එය නඩත්තු නොකරමි.

යමෙකු සුදුසු මෙවලමක් පෙන්වා දෙනු ඇතැයි අපේක්‍ෂා කරමු. නැතිනම් මම එකක් සොයාගත් විට හෝ ලියන විට මෙය යාවත්කාලීන කරමි.


1
ඔබ හරි, මේසයේ ඇති සංකීර්ණ නූල් සඳහා ඔබට බාෂ් පමණක් නොව හොඳ පුස්තකාලයක් භාවිතා කළ යුතුය. මම හිතන්නේ nodejs වලට මේ වගේ ක්‍රියා වලට වඩා හොඳ විසඳුම් තියෙනවා. මෙම උදාහරණය
යෙයා

1
හායි, හොඳ පිළිතුරක්, මම පහත යෝජනා කර ඇති පයිතන් විසඳුමට සබැඳියක් එකතු කරමි . එය stackoverflow.com/a/35123787/1504300 , එය හොඳින් ක්‍රියාත්මක වන අතර එය ඉතා සරල ය. මම ඔබේ ලිපිය සංස්කරණය කිරීමට උත්සාහ කළ නමුත් සංස්කරණය ප්‍රතික්ෂේප කර ඇත
සැබවින්ම

28

CSV ආකෘතියෙන් සිදුවිය හැකි දේ පිළිබඳ සාමාන්‍ය නඩුව හසුරුවන්නේ නැති නිසා මෙම පිටුවේ ඇති බොහෝ පිළිතුරු දුර්වල ය. උදා: සෑම විටම අවසානයේ මතුවන ක්ෂේත්‍ර සහ වෙනත් තත්වයන් තුළ කොමා සහ මිල ගණන්. සියලුම වලංගු CSV ආදාන දත්ත සඳහා ක්‍රියා කරන පොදු විසඳුමක් අපට අවශ්‍යය.

පයිතන්හි සරල හා ශක්තිමත් විසඳුමක් මෙන්න:

#!/usr/bin/env python

import csv
import sys

tab_in = csv.reader(sys.stdin, dialect=csv.excel_tab)
comma_out = csv.writer(sys.stdout, dialect=csv.excel)

for row in tab_in:
    comma_out.writerow(row)

එම ගොනුව නම් කරන්න tab2csv, එය ඔබේ මාවතෙහි තබන්න, එයට අවසර ලබා දෙන්න, ඉන්පසු මේ ආකාරයට භාවිතා කරන්න:

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

පයිතන් CSV හැසිරවීමේ කාර්යයන් CSV ආදාන ආකෘතිය (ය) සඳහා මූලික අවස්ථා ආවරණය කරයි.

ප්‍රවාහ ප්‍රවේශයක් හරහා ඉතා විශාල ගොනු හැසිරවීමට මෙය වැඩිදියුණු කළ හැකිය.


8
ඊටත් වඩා විශ්වසනීය විසඳුමක් වනුයේ ඇත්ත වශයෙන්ම පයිතන් සමඟ දත්ත සමුදායට සම්බන්ධ වීමයි, එවිට ඔබට විශාල දත්ත කට්ටල සමඟ කටයුතු කිරීමට කළ යුතු දේ කිරීමට පහසු කාලයක් තිබිය යුතුය (ප්‍රති results ල, ප්‍රවාහය ආදිය).
ජොෂ් රුම්බට්

Osh ජොෂ්රම්බට්, ඇත්තෙන්ම ප්‍රමාදයි, නමුත් ඔබේ අදහස් දැක්වීමට අනුපූරකව මම 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*

බැර: ඇමේසන් ආර්ඩීඑස් වෙතින් වගුව සීඑස්වී ගොනුවකට අපනයනය කිරීම


ඒක පිස්සු ඔනලයිනර් එකක්. hatsoff
එලියා

19
  1. තර්කනය:

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

ඔබ CSV වගුවක් සාදන විට, සේවාදායකය දත්ත සමුදා නාමාවලියෙහි වගු ආකෘති ගොනුවක් සාදයි. ගොනුව වගු නාමයෙන් ආරම්භ වන අතර .frm දිගුවක් ඇත. ගබඩා එන්ජිම දත්ත ගොනුවක් ද නිර්මාණය කරයි. එහි නම වගු නාමයෙන් ආරම්භ වන අතර .CSV දිගුවක් ඇත. දත්ත ගොනුව සරල පෙළ ගොනුවකි. ඔබ මේසය තුළ දත්ත ගබඩා කරන විට, ගබඩා එන්ජිම එය කොමා වලින් වෙන් කළ අගයන් ආකෘතියෙන් දත්ත ගොනුවට සුරකිනු ඇත.


1
වෙනත් කිසිදු වෙනස් කිරීමකින් තොරව මෙය නිවැරදි බැවින් සතුටක්.
ෂුල්මන්

14

මෙම පිළිතුර Python සහ ජනප්‍රිය තෙවන පාර්ශවීය පුස්තකාලයක් වන 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
ඇලෙක්සැන්ඩර් බෝල්ටසාර්

5
Lex ඇලෙක්සැන්ඩර් බෝල්ටසාර්, හරි, එය ප්‍රයෝජනවත් බව පෙනේ, නමුත් එය දත්ත සමුදාය සමඟ අන්තර් ක්‍රියා කිරීමට පයිතන් කේතය භාවිතා නොකරයි. එම ප්‍රශ්නය පිළිබඳ අදහස් දැක්වීම බලන්න.
බෙන්

12

මෙය සරල වන අතර, එය කණ්ඩායම් මාදිලිය හෝ ප්‍රතිදාන ගොනු අවශ්‍ය නොවී ඕනෑම දෙයක් මත ක්‍රියා කරයි:

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

from your_table where etc;

පැහැදිලි කිරීම:

  1. එක් එක් ක්ෂේත්‍රය "සමඟ ප්‍රතිස්ථාපනය කරන්න ""->replace(field1, '"', '""')
  2. එක් එක් ප්‍රති result ලය උද්ධෘත ලකුණු වලින් වට කරන්න -> concat('"', result1, '"')
  3. උපුටා ගත් එක් එක් ප්‍රති result ලය අතර කොමාව තබන්න -> concat_ws(',', quoted1, quoted2, ...)

ඒක තමයි!


1
තීරු නොගැලපීමක NULLප්‍රති values ​​ලයක් ලෙස අගයන් මඟ හැරෙන බව සලකන්න concat_ws(). මෙය වළක්වා ගැනීම සඳහා හිස් නූලක් භාවිතා කරන්න: IFNULL(field, '')(හෝ ඔබ නියෝජනය කිරීමට වෙනත් ඕනෑම දෙයක් භාවිතා කරන්න NULL)
මාකෝ රෝයි

10

ඉහත පිළිතුරට විකල්පයක් ලෙස, ඔබට CSV එන්ජිම භාවිතා කරන MySQL වගුවක් තිබිය හැකිය.

එවිට ඔබට ඔබේ දෘඩ තැටියේ ගොනුවක් ඇති අතර එය සෑම විටම CSV ආකෘතියකින් යුක්ත වන අතර එය සැකසීමෙන් තොරව පිටපත් කළ හැකිය.


1
ලිපිගොනු ප්‍රමාණය / ලිවීම් / කියවීම් / යනාදිය අනුව මෙහි ඇති සීමාවන් මොනවාද?
සාක් ස්මිත්

9

පෙර පිළිතුරු පුළුල් කිරීම සඳහා, පහත දැක්වෙන එක්-ලයිනර් ටැබ් වෙන් කළ ගොනුවක් ලෙස තනි වගුවක් අපනයනය කරයි. එය ස්වයංක්‍රීයකරණය සඳහා සුදුසු වේ, සෑම දිනකම දත්ත සමුදාය අපනයනය කරයි.

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 ධාවනය කළ හැකි නම් මෙය හොඳ විසඳුමකි!
ජෝන් ෆියාලා

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

පර්ල් ස්ක්‍රිප්ට් (වෙනත් තැනකින් ස්නයිප් කර ඇත) ටැබ් පරතරය සහිත ක්ෂේත්‍ර CSV බවට පරිවර්තනය කිරීමේ හොඳ කාර්යයක් කරයි.


මේක නියමයි. සුළු වැඩි දියුණු කිරීමක් විය හැක්කේ සංඛ්‍යා හැර අන් සියල්ලම උපුටා දැක්වීමයි perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^\d+(?:\.\d+)?$/ ? $_ : qq("$_")} @F '- ඔබ උපුටා දක්වන්නේ නැත1.2.3
artfulrobot

5

හරියටම CSV ආකෘතියක් ලෙස නොව , ප්‍රතිදානය දේශීය ගොනුවකට සුරැකීමට MySQL සේවාදායකයාගේ teeවිධානය භාවිතා කළ හැකිය :

tee foobar.txt
SELECT foo FROM bar;

ඔබට එය භාවිතයෙන් අක්‍රිය කළ හැකිය notee.

ගැටළුව SELECT … INTO OUTFILE …;වන්නේ සේවාදායකයේ ලිපිගොනු ලිවීමට අවසර අවශ්‍ය වීමයි.


.Txt වෙනුවට .csv දිගුව භාවිතා කරන්නේ නම්, දැනුවත් විය යුතු ආකෘතිකරණ ගැටළු තිබේද?
datalifenyc

@ මයිඩෙලාබ් ආකෘතිකරණය කිරීමේ ගැටළු පැන නගින්නේ කොමා ආදියෙනි. CSV යනු සරල පෙළ ආකෘතියකි, එබැවින් දිගුව මාරු කිරීමෙන් ආකෘතිකරණ ගැටළුවක් නොමැත.
jkmartindale

4

මට එකම ගැටලුවකට මුහුණ දීමට සිදු වූ අතර පෝල්ගේ පිළිතුර විකල්පයක් නොවූයේ එය ආර්.ඩී.එස්. දත්ත කොමාව සහ පටිති කාවැදී ඇති බැවින් ටැබය කොමාව සමඟ ප්‍රතිස්ථාපනය කිරීම ක්‍රියා නොකරයි. MySQL -client සඳහා අතහැර දැමීමේ විකල්පයක් වන mycli --csvධජය සහිත කොටුවෙන් පිටත csv ප්‍රතිදානය සඳහා සහාය වන බව මට පෙනී ගියේය

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

චාම් එකක් මෙන් ක්‍රියා කරයි, ඔබට මැකෝස් හි මයික්ලි ස්ථාපනය කළ හැකිය : brew update && brew install mycli. මම නැවත කිසිදිනෙක mysql සේවාදායකයා භාවිතා නොකරමි, mycli එතරම් නීත්‍යානුකූලයි!
bithavoc

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 හි මගේ පිළිතුර බලන්න - පිටත දේශීයයට තෝරන්න?තව ටිකක් සන්දර්භය / තොරතුරු සඳහා.

මම විකල්ප නම් පවත්වා ගැනීමට උත්සාහ කළෙමි, 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';

ක්‍රියා නොකරයි, ඔබ කළ යුත්තේ \(බැක්ස්පෑෂ්) විමසුමේ සිට (ෆෝවර්ඩ්ස් ප්ලාෂ් /)

ඒක වැඩ කරනවා !!

උදාහරණයක්:

පිටත සිට පැමිණීමට තෝරාගන්න 'සී: / ProgramData / MySQL / MySQL සේවාදායකය 8.0 / උඩුගත කිරීම් / FileName.csv' නියම කර ඇති ක්ෂේත්‍ර ',' ආවරණය කර ඇති '' 'රේඛා මගින් නියම කර ඇති රේඛා' \ n ';

ඔබ සාර්ථක විමසුම ක්‍රියාත්මක කරන සෑම අවස්ථාවකම, එය සෑම විටම නව csv ගොනුව ජනනය කරනු ඇත! නියමයි?


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

පහත දැක්වෙන bash ස්ක්‍රිප්ට් මට වැඩ කරයි. එය විකල්පයක් ලෙස ඉල්ලූ වගු සඳහා යෝජනා ක්‍රමය ද ලබා ගනී.

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

0

ඔබ භාවිතා කරන යන්ත්‍රයේ PHP ස්ථාපනය කර ඇත්නම්, ඒ සඳහා ඔබට PHP පිටපතක් ලිවිය හැකිය. එයට PHP ස්ථාපනය සඳහා MySQL දිගුව ස්ථාපනය කර ඇත.

විධාන රේඛාවෙන් ඔබට PHP පරිවර්තකය අමතන්න:

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

මම ඇතුළු --php-ini ස්විචය , මන්ද ඔබට MySQL දිගුව සක්‍රීය කරන ඔබේම PHP වින්‍යාසය භාවිතා කිරීමට අවශ්‍ය විය හැකිය. PHP 5.3.0+ හි එම දිගුව පෙරනිමියෙන් සක්‍රීය කර ඇති බැවින් එය සක්‍රීය කිරීම සඳහා වින්‍යාසය භාවිතා කිරීම තවදුරටත් අවශ්‍ය නොවේ.

එවිට ඔබට ඕනෑම සාමාන්‍ය PHP පිටපතක් මෙන් ඔබේ අපනයන පිටපත ලිවිය හැකිය:

<?php
    #mysql_connect("localhost", "username", "password") or die(mysql_error());
    mysql_select_db("mydb") or die(mysql_error());

    $result = mysql_query("SELECT * FROM table_with_the_data p WHERE p.type = $typeiwant");

    $result || die(mysql_error());

    while($row = mysql_fetch_row($result)) {
      $comma = false;
      foreach ($row as $item) {

        # Make it comma separated
        if ($comma) {
          echo ',';
        } else {
          $comma = true;
        }

        # Quote the quotes
        $quoted = str_replace("\"", "\"\"", $item);

        # Quote the string
        echo "\"$quoted\"";
      }
        echo "\n";
    }
?>

මෙම ක්‍රමයේ ඇති වාසිය නම්, එයට වර්චාර් සහ පෙළ ක්ෂේත්‍ර සමඟ කිසිදු ගැටළුවක් නොමැති වීම, නව රේඛා අඩංගු පෙළ ඇති වීමයි. එම ක්ෂේත්‍ර නිවැරදිව උපුටා දක්වා ඇති අතර ඒවායේ ඇති නව රේඛා CSV පා er කයා විසින් පෙළෙහි කොටසක් ලෙස අර්ථකථනය කරනු ඇත, වාර්තා බෙදුම්කරුවන් නොවේ. එය සෙඩ් හෝ පසුව නිවැරදි කිරීමට අපහසු දෙයකි .


1
අනවශ්‍ය ලෙස සංකීර්ණ නොවී, නිවැරදි විය හැකි දිශාවකට යන එකම විසඳුම මෙයයි - තව ටිකක් වැඩ කළත්. CSV මුලින් පෙනෙන ප්‍රමාණයට වඩා සංකීර්ණ වන අතර ඔබ විවිධාකාර වැරදි සිදු කර ඇත. උදා: මුල් පිටුවේ බැක්ස්ලෑෂ්. CSV වෙත ලිවීම සඳහා සියලු ගැටළු විසඳා ඇති පුස්තකාලයක් භාවිතා කිරීම වඩා හොඳය.
mc0e

@ mc0e සාමාන්‍යයෙන් ඔබ උපුටා දැක්වීම දෙගුණ කරයි හෝ උපුටා දැක්වීමෙන් ගැලවෙන්න. උපුටා දැක්වීම දෙගුණ කිරීමට මම තීරණය කළෙමි, එබැවින් මට ගැලවීමේ චරිතයක් අවශ්‍ය නොවේ. විවිධ මෘදුකාංග වල CSV විස්තර පිළිබඳ විවිධ අදහස් ඇත. නිදසුනක් ලෙස, MySQL හි LOAD DATA සැබවින්ම ගැලවීමේ චරිතයක් ලෙස සලකන අතර විවෘත කාර්යාල කැල්ක් එසේ නොකරයි. මම පිළිතුර ලියන විට මම පැතුරුම්පතකට දත්ත අපනයනය කරමින් සිටියෙමි.
user7610

1
දවසේ මගේ දත්ත කට්ටලය අපනයනය කිරීමට අවශ්‍ය සියල්ල මගේ කේතය හසුරුවයි ;) ඔබේ පිළිතුර ද නිවැරදි දිශාවට පියවරකි, නමුත් එහි පළමු විවරණයේ සඳහන් වන පරිදි එය 1) ස්ක්‍රිප්ට් එකෙන් වර්ග දත්ත ගබඩාවට කෙලින්ම සම්බන්ධ විය යුතුය. 2) නිසි csv පුස්තකාලයක් භාවිතා කරන්න.
user7610

0

මෙම කේතය උත්සාහ කරන්න:

SELECT 'Column1', 'Column2', 'Column3', 'Column4', 'Column5'
UNION ALL
SELECT column1, column2,
column3 , column4, column5 FROM demo
INTO OUTFILE '/tmp/demo.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

වැඩි විස්තර සඳහා: http://dev.mysql.com/doc/refman/5.1/en/select-into.html


පහත දැක්වෙන විමසුම ක්‍රියාත්මක කරන්නේ නම් මට දෝෂයක් ඇති වේ. මගේ විමසුම: justpaste.it/2fp6f ඕනෑම උදව්වක් ස්තූතියි. @Indrajeet සිං
zus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.