Php script से csv फाइल कैसे बनायें और डाउनलोड करें?


89

मैं एक नौसिखिया प्रोग्रामर हूं और मैंने अपने प्रश्न के बारे में बहुत खोज की लेकिन इस बारे में कोई उपयोगी समाधान या ट्यूटोरियल नहीं खोज सका।

मेरा लक्ष्य है कि मेरे पास एक PHP सरणी है और सरणी तत्व पृष्ठ पर एक सूची में दिखाई दे रहे हैं।

मैं एक विकल्प जोड़ना चाहता हूं, ताकि यदि कोई उपयोगकर्ता चाहे, तो वह सरणी तत्वों के साथ एक सीएसवी फ़ाइल बना सकता है और इसे डाउनलोड कर सकता है।

मुझे नहीं पता कि यह कैसे करना है। मैंने भी बहुत खोजा है। लेकिन अभी तक कोई सहायक संसाधन नहीं मिला है।

कृपया मुझे अपने द्वारा इसे लागू करने के लिए कुछ ट्यूटोरियल या समाधान या सलाह प्रदान करें। जैसा कि मैं नौसिखिया हूं कृपया समाधान लागू करने के लिए आसान प्रदान करें।

मेरा सरणी ऐसा दिखता है:

Array
(
    [0] => Array
        (
            [fs_id] => 4c524d8abfc6ef3b201f489c
            [name] => restaurant
            [lat] => 40.702692
            [lng] => -74.012869
            [address] => new york
            [postalCode] => 
            [city] => NEW YORK
            [state] => ny
            [business_type] => BBQ Joint
            [url] => 
        )

)

2
CSV फ़ाइल के लिए phpExcel थोड़ा बहुत है .. php.net/manual/en/function.fputcsv.php
डेमियन पीर्सी

अपनी सरणी संरचना दिखाएं और मैं तत्वों को एक csv में तत्वों को चालू करने के लिए कुछ कोड प्रदान करता हूं
आधे-तेज़

@ आधा-उपवास मैंने पोस्ट में सरणी संरचना जोड़ा है
user2302780

2
csv फ़ाइल में कॉलम शीर्षक कैसे जोड़ सकते हैं?
user2302780

जवाबों:


200

आप अपने सरणी से सही csv लाइनों को उत्पन्न करने के लिए अपने सरणियों के लिए fputcsv () में निर्मित का उपयोग कर सकते हैं , इसलिए आपको इस तरह से लाइनों को लूप और इकट्ठा करना होगा:

$f = fopen("tmp.csv", "w");
foreach ($array as $line) {
    fputcsv($f, $line);
}

ब्राउज़रों को "इस रूप में सहेजें" संवाद की पेशकश करने के लिए, आपको HTTP हेडर इस तरह भेजना होगा ( rfc में इस हेडर के बारे में और देखें ):

header('Content-Disposition: attachment; filename="filename.csv";');

यह सब एक साथ डालें:

function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") {
    // open raw memory as file so no temp files needed, you might run out of memory though
    $f = fopen('php://memory', 'w'); 
    // loop over the input array
    foreach ($array as $line) { 
        // generate csv lines from the inner arrays
        fputcsv($f, $line, $delimiter); 
    }
    // reset the file pointer to the start of the file
    fseek($f, 0);
    // tell the browser it's going to be a csv file
    header('Content-Type: application/csv');
    // tell the browser we want to save it instead of displaying it
    header('Content-Disposition: attachment; filename="'.$filename.'";');
    // make php send the generated csv lines to the browser
    fpassthru($f);
}

और आप इसे इस तरह से उपयोग कर सकते हैं:

array_to_csv_download(array(
  array(1,2,3,4), // this array is going to be the first row
  array(1,2,3,4)), // this array is going to be the second row
  "numbers.csv"
);

अद्यतन:
इसके बजाय php://memoryआप php://outputफ़ाइल डिस्क्रिप्टर के लिए भी उपयोग कर सकते हैं और मांग और इस तरह से दूर कर सकते हैं:

function array_to_csv_download($array, $filename = "export.csv", $delimiter=";") {
    header('Content-Type: application/csv');
    header('Content-Disposition: attachment; filename="'.$filename.'";');

    // open the "output" stream
    // see http://www.php.net/manual/en/wrappers.php.php#refsect2-wrappers.php-unknown-unknown-unknown-descriptioq
    $f = fopen('php://output', 'w');

    foreach ($array as $line) {
        fputcsv($f, $line, $delimiter);
    }
}   

2
क्यों नहीं echoउत्पन्न CSV लाइनों सीधे लूप में?
एलेक्स श्वेस्टरोव

1
@AlexShesterov, मुख्य कारण यह है कि fputcsv()उत्पन्न लाइन को वापस नहीं करता है, इसे लिखने के लिए एक फ़ाइल विवरणक की आवश्यकता होगी। यदि आप स्मृति में बाधा हैं, तो आप बफर को फिर से लिख सकते हैं, साफ़ कर सकते हैं। या इसके बजाय केवल एक वास्तविक अस्थायी फ़ाइल का उपयोग करें।
कॉम्प्लेक्स 857

@ complex857 मैं सीएसवी के लिए कॉलम शीर्षक कैसे जोड़ सकता हूं?
user2302780

@ user2302780: आप कॉलम नामों की एक पंक्ति के साथ अपना डेटा उपसर्ग करते हैं। आप डेटा-एरे से कुंजियों का उपयोग कुछ इस तरह से कर सकते हैं$data = array_merge(array(array_keys($data[0])), $data);
कॉम्प्लेक्स 857

1
@JoseRojas कि जब से आप तार पर कुछ डालते हैं, तब से उम्मीद की जानी चाहिए (कि php के साथ चीजों को आउटपुट करने का मतलब है कि वैचारिक रूप से) आप उस पर वापस नहीं जा सकते। उपयोग करने के लिए php://outputदूसरा अपडेटेड कोड सैंपल देखें।
कॉम्प्लेक्स 857

18

मेरे पास @ complex857 समाधान का जवाब देने के लिए पर्याप्त प्रतिष्ठा नहीं है। यह बहुत अच्छा काम करता है, लेकिन मुझे जोड़ना था; सामग्री-विवाद शीर्ष लेख के अंत में। इसके बिना ब्राउज़र फ़ाइल नाम के अंत में दो डैश जोड़ता है (उदाहरण के लिए "Export.csv" के बजाय फ़ाइल को "export.csv--" के रूप में सहेजा जाता है)। संभवतः यह हेडर लाइन के अंत में \ r \ n को साफ करने की कोशिश करता है।

सही लाइन इस तरह दिखनी चाहिए:

header('Content-Disposition: attachment;filename="'.$filename.'";');

मामले में जब CSV में UTF-8 वर्ण होते हैं, तो आपको सामग्री-प्रकार लाइन को बदलकर UTF-8 को एन्कोडिंग बदलना होगा:

header('Content-Type: application/csv; charset=UTF-8');

इसके अलावा, मैं इसे fseek () के बजाय रिवाइंड () का उपयोग करने के लिए अधिक सुरुचिपूर्ण पाता हूं:

rewind($f);

आपके समाधान के लिए धन्यवाद!


2
मैंने --खुद
फिल्मनाम

14

कोशिश करो ... सीएसवी डाउनलोड।

<?php 
mysql_connect('hostname', 'username', 'password');
mysql_select_db('dbname');
$qry = mysql_query("SELECT * FROM tablename");
$data = "";
while($row = mysql_fetch_array($qry)) {
  $data .= $row['field1'].",".$row['field2'].",".$row['field3'].",".$row['field4']."\n";
}

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename="filename.csv"');
echo $data; exit();
?>

यदि कोई फ़ील्ड मान
सम्‍मिलित है

13

यह वह फ़ंक्शन है जो मैंने अपने प्रोजेक्ट के लिए उपयोग किया था, और यह उम्मीद के मुताबिक काम करता है।

function array_csv_download( $array, $filename = "export.csv", $delimiter=";" )
{
    header( 'Content-Type: application/csv' );
    header( 'Content-Disposition: attachment; filename="' . $filename . '";' );

    // clean output buffer
    ob_end_clean();

    $handle = fopen( 'php://output', 'w' );

    // use keys as column titles
    fputcsv( $handle, array_keys( $array['0'] ) );

    foreach ( $array as $value ) {
        fputcsv( $handle, $value , $delimiter );
    }

    fclose( $handle );

    // flush buffer
    ob_flush();

    // use exit to get rid of unexpected output afterward
    exit();
}

1
मेरे पास वर्डप्रेस सेंड_हेडर्स हुक में इसे लागू करने का कठिन समय था, क्योंकि हर बार यह सभी वर्तमान पृष्ठ html को csv फ़ाइल के अंत में जोड़ देता है। ये उत्तर मुझे बहुत रोकते हैं, लेकिन मैं इसका उपयोग बफर ऑपरेशन के बिना करता हूं।
ओलेग अपनोविच

स्वच्छ आउटपुट बफ़र ने मेरे लिए इस समस्या को हल कर दिया कि शुरुआत में इन कोड पंक्तियों के उपयोग से पहले और गठित फ़ाइल के अंत में खाली पंक्तियाँ थीं।
शारुनस बायल्स्कीस

8

CSV में php ऐरे को कन्वर्ट करने के लिए नीचे दिए गए कोड का उपयोग करें

<?php
   $ROW=db_export_data();//Will return a php array
   header("Content-type: application/csv");
   header("Content-Disposition: attachment; filename=test.csv");
   $fp = fopen('php://output', 'w');

   foreach ($ROW as $row) {
        fputcsv($fp, $row);
   }
   fclose($fp);

3

यदि आप सरणी संरचना हमेशा उस सटीक फैशन में बहुआयामी होंगे, तो हम इस तरह के तत्वों के माध्यम से पुनरावृति कर सकते हैं:

$fh = fopen('somefile.csv', 'w') or die('Cannot open the file');

for( $i=0; $i<count($arr); $i++ ){
    $str = implode( ',', $arr[$i] );
    fwrite( $fh, $str );
    fwrite( $fh, "\n" );
}
fclose($fh);

यह करने का एक तरीका है ... आप इसे मैन्युअल रूप से कर सकते हैं लेकिन यह तरीका जल्दी और समझने और पढ़ने में आसान है।

तब आप अपने हेडर को प्रबंधित करेंगे कि फाइल को बाहर निकालने के लिए कौन-कौन से जटिल857 क्या कर रहे हैं। आप तब अनलिंक () का उपयोग करके फ़ाइल को हटा सकते हैं यदि आपको इसकी आवश्यकता नहीं है, या आप चाहें तो इसे सर्वर पर छोड़ सकते हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.