PHP के माध्यम से CSV को निर्यात करें


158

मान लीजिए कि मेरे पास एक डेटाबेस है .... क्या कोई ऐसा तरीका है जो मैं डेटाबेस से सीएसवी फ़ाइल (और पाठ फ़ाइल [यदि संभव हो तो)) के माध्यम से PHP में निर्यात कर सकता हूं?


जवाबों:


308

मैं व्यक्तिगत रूप से किसी भी सरणी से CSV सामग्री बनाने के लिए इस फ़ंक्शन का उपयोग करता हूं।

function array2csv(array &$array)
{
   if (count($array) == 0) {
     return null;
   }
   ob_start();
   $df = fopen("php://output", 'w');
   fputcsv($df, array_keys(reset($array)));
   foreach ($array as $row) {
      fputcsv($df, $row);
   }
   fclose($df);
   return ob_get_clean();
}

फिर आप अपने उपयोगकर्ता को उस फ़ाइल को कुछ इस तरह से डाउनलोड कर सकते हैं:

function download_send_headers($filename) {
    // disable caching
    $now = gmdate("D, d M Y H:i:s");
    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    header("Last-Modified: {$now} GMT");

    // force download  
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");

    // disposition / encoding on response body
    header("Content-Disposition: attachment;filename={$filename}");
    header("Content-Transfer-Encoding: binary");
}

उपयोग उदाहरण:

download_send_headers("data_export_" . date("Y-m-d") . ".csv");
echo array2csv($array);
die();

1
स्थानीय सर्वर पर यह काम कर रहा है, लेकिन दूर में यह एक नया पृष्ठ प्रदर्शित करता है जिसमें सामग्री और कोई डाउनलोड विंडो नहीं है (माई इंग्लिश के लिए खेद है)
khaled_webdev

2
त्रुटियों के कई कारण हो सकते हैं, उन्हें ढूंढने का सबसे सरल तरीका यह है कि आप अपनी अपाचे एरर.लॉग फ़ाइल को देखें।
Alain Tiemblo

7
आपको die();बस एक कॉल करने की आवश्यकता है echo array2csv();, मेरे उत्तर को संपादित करेगा। अपने पेज में कुछ आउटपुट करने से पहले अपना सीएसवी जेनरेट करना सुनिश्चित करें।
एलेन टिंबलो

1
@ ring0 मुझे लगता है कि हेडर में पिछली तारीख डालने से पेज कैशिंग अक्षम हो जाता है, 2 उदाहरण देखें php.net/manual/en/function.header.php
अभिषेक

2
आपके ब्राउज़र को माइम देता है ताकि आपको वर्तमान विंडो में दिए गए csv के बजाय एक डाउनलोड मोडल मिल जाए।
Alain Tiemblo

32

आप इस आदेश का उपयोग करके दिनांक निर्यात कर सकते हैं।

<?php

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);

$fp = fopen('file.csv', 'w');

foreach ($list as $fields) {
    fputcsv($fp, $fields);
}

fclose($fp);
?>

पहले आपको mysql सर्वर से सरणी में डेटा लोड करना होगा


10
या, आप एक मानक लाने के लूप के अंदर fputcsv () कर सकते हैं और इसे वापस लौटा सकते हैं सीधे लौटे परिणामों में से।
DampeS8N

10
@ DampeS8N, +1 को एक वाक्य में "इसे नीचे सीधा करें" के उपयोग के लिए।
एच्कोविलेगेंड


14

सिर्फ रिकॉर्ड के लिए, कॉन्फिडेंशियल है fputcsvया तो तेजी से (मेरा मतलब है) की तुलना में या यहां तक ​​कि implode; और फ़ाइल का आकार छोटा है:

// The data from Eternal Oblivion is an object, always
$values = (array) fetchDataFromEternalOblivion($userId, $limit = 1000);

// ----- fputcsv (slow)
// The code of @Alain Tiemblo is the best implementation
ob_start();
$csv = fopen("php://output", 'w');
fputcsv($csv, array_keys(reset($values)));
foreach ($values as $row) {
    fputcsv($csv, $row);
}
fclose($csv);
return ob_get_clean();

// ----- implode (slow, but file size is smaller)
$csv = implode(",", array_keys(reset($values))) . PHP_EOL;
foreach ($values as $row) {
    $csv .= '"' . implode('","', $row) . '"' . PHP_EOL;
}
return $csv;
// ----- concatenation (fast, file size is smaller)
// We can use one implode for the headers =D
$csv = implode(",", array_keys(reset($values))) . PHP_EOL;
$i = 1;
// This is less flexible, but we have more control over the formatting
foreach ($values as $row) {
    $csv .= '"' . $row['id'] . '",';
    $csv .= '"' . $row['name'] . '",';
    $csv .= '"' . date('d-m-Y', strtotime($row['date'])) . '",';
    $csv .= '"' . ($row['pet_name'] ?: '-' ) . '",';
    $csv .= PHP_EOL;
}
return $csv;

यह दस से लेकर हजारों पंक्तियों तक, कई रिपोर्टों के अनुकूलन का निष्कर्ष है। तीन उदाहरणों ने 1000 पंक्तियों के तहत ठीक काम किया, लेकिन डेटा बड़ा होने पर विफल हो जाता है।


9

मैं parsecsv-for-php को नेस्टेड न्यूलाइन्स और कोट्स के साथ किसी भी समस्या के आसपास नंबर पाने के लिए सलाह देता हूं ।


8

100 से अधिक लाइनों के साथ काम करता है, यदि आप हेडर में फ़ाइल का आकार सरल निर्दिष्ट करते हैं, तो अपनी कक्षा में प्राप्त () विधि को कॉल करें

function setHeader($filename, $filesize)
{
    // disable caching
    $now = gmdate("D, d M Y H:i:s");
    header("Expires: Tue, 01 Jan 2001 00:00:01 GMT");
    header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
    header("Last-Modified: {$now} GMT");

    // force download  
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header('Content-Type: text/x-csv');

    // disposition / encoding on response body
    if (isset($filename) && strlen($filename) > 0)
        header("Content-Disposition: attachment;filename={$filename}");
    if (isset($filesize))
        header("Content-Length: ".$filesize);
    header("Content-Transfer-Encoding: binary");
    header("Connection: close");
}

function getSql()
{
    // return you own sql
    $sql = "SELECT id, date, params, value FROM sometable ORDER BY date;";
    return $sql;
}

function getExportData()
{
    $values = array();

    $sql = $this->getSql();
    if (strlen($sql) > 0)
    {
        $result = dbquery($sql); // opens the database and executes the sql ... make your own ;-) 
        $fromDb = mysql_fetch_assoc($result);
        if ($fromDb !== false)
        {
            while ($fromDb)
            {
                $values[] = $fromDb;
                $fromDb = mysql_fetch_assoc($result);
            }
        }
    }
    return $values;
}

function get()
{
    $values = $this->getExportData(); // values as array 
    $csv = tmpfile();

    $bFirstRowHeader = true;
    foreach ($values as $row) 
    {
        if ($bFirstRowHeader)
        {
            fputcsv($csv, array_keys($row));
            $bFirstRowHeader = false;
        }

        fputcsv($csv, array_values($row));
    }

    rewind($csv);

    $filename = "export_".date("Y-m-d").".csv";

    $fstat = fstat($csv);
    $this->setHeader($filename, $fstat['size']);

    fpassthru($csv);
    fclose($csv);
}


6

जैसे @ Dampes8N ने कहा:

$result = mysql_query($sql,$conecction);
$fp = fopen('file.csv', 'w');
while($row = mysql_fetch_assoc($result)){
    fputcsv($fp, $row);
}
fclose($fp);

उम्मीद है की यह मदद करेगा।

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