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




bash csv (17)

MySQL - बैच, -बी

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

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

https://code.i-harness.com

क्या लिनक्स कमांड लाइन से 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. तर्क :

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

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


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

?>


इसे करने का एक काफी गहरा तरीका है। इसे कहीं मिला, कोई क्रेडिट नहीं ले सकता है

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 /// का मतलब है कि पहले // के बीच क्या है, दूसरे के बीच क्या है //
  • अंत में "जी" एक संशोधक है जिसका अर्थ है "सभी उदाहरण, केवल पहले नहीं"
  • ^ (इस संदर्भ में) का अर्थ लाइन की शुरुआत है
  • $ (इस संदर्भ में) का मतलब रेखा का अंत है

तो, इसे सब एक साथ रखो:

s/'/\'/          replace ' with \'
s/\t/\",\"/g     replace all \t (tab) with ","
s/^/\"/          at the beginning of the line place a "
s/$/\"/          at the end of the line place a "
s/\n//g          replace all \n (newline) with nothing

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

tee foobar.txt
SELECT foo FROM bar;

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

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


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

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

यह नाम फ़ाइल बनायेगा: डेटाबेस.table.csv


पिछले उत्तरों पर विस्तार करने के लिए, निम्न एक-लाइनर टैब-पृथक फ़ाइल के रूप में एक एकल तालिका निर्यात करता है। यह स्वचालन के लिए उपयुक्त है, डेटाबेस को हर दिन या तो निर्यात करता है।

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    

यदि आपके द्वारा उपयोग की जा रही मशीन पर 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";
    }
?>

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


यह आसान है, और यह बैच मोड या आउटपुट फ़ाइलों की आवश्यकता के बिना कुछ भी काम करता है:

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

from your_table where etc;

स्पष्टीकरण:

  1. प्रत्येक फ़ील्ड में "साथ" "बदलें -> प्रतिस्थापित करें (फ़ील्ड 1, '' ',' '' '' ')
  2. उद्धरण चिह्नों में प्रत्येक परिणाम के आसपास -> concat ('' ', परिणाम 1,' '')
  3. प्रत्येक उद्धृत परिणाम के बीच एक अल्पविराम रखें -> concat_ws (',', उद्धृत 1, उद्धृत 2, ...)

बस!


यह मुझे दो बार बचाया। तेज़ और यह काम करता है!

--batch

--raw

उदाहरण:

sudo mysql -udemo_user -p -h127.0.0.1 --port=3306 \
   --default-character-set=utf8 --database=demo_database \
   --batch --raw < /var/demo_sql_query.sql > /var/demo_csv_export.csv

यहां मैं क्या करता हूं:

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

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


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

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


साथ ही, यदि आप बैश कमांड लाइन पर क्वेरी कर रहे हैं, तो मेरा मानना ​​है कि tr कमांड को डिफॉल्ट टैब को मनमाने ढंग से डिलीमीटर करने के लिए उपयोग किया जा सकता है।

$ echo "SELECT * FROM Employee" | mysql Database | tr '\t' ,


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


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 प्रक्रिया के अंतर्गत चल रहा है उसे चयनित निर्देशिका में लिखने की अनुमति होनी चाहिए, या आदेश विफल हो जाएगा।

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


Try this code:
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';

for more: http://dev.mysql.com/doc/refman/5.1/en/select-into.html






quotes