পিএইচপি এর মাধ্যমে সিএসভিতে রফতানি করুন


158

ধরা যাক আমার কাছে একটি ডাটাবেস আছে .... পিএইচপি-র মাধ্যমে কোনও ডাটাবেস থেকে আমার কাছে থাকা একটি সিএসভি ফাইলের (এবং পাঠ্য ফাইল [যদি সম্ভব হয়]) রফতানি করার উপায় আছে?


উত্তর:


308

আমি ব্যক্তিগতভাবে এই ফাংশনটি কোনও অ্যারে থেকে সিএসভি সামগ্রী তৈরি করতে ব্যবহার করি।

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

2
ত্রুটির জন্য বেশ কয়েকটি কারণ থাকতে পারে, এগুলি সন্ধান করার সহজ উপায় হ'ল আপনার অ্যাপাচি ত্রুটি.লগ ফাইলটি।
আলেন টাইম্বলো

7
die();আপনার ঠিক পরে একটি কল করা দরকার echo array2csv();, আমার উত্তরটি সম্পাদনা করবে। আপনার পৃষ্ঠায় কিছু আউটপুট দেওয়ার আগে আপনার সিএসভি জেনার বিষয়ে নিশ্চিত হন।
আলাইন টাইম্বলো

1
@ রিং0 আমার মনে হয়েছে গত তারিখটি শিরোনামে রাখলে পৃষ্ঠা ক্যাচিং অক্ষম হয়ে গেছে, দ্বিতীয় উদাহরণটি দেখুন php.net/manual/en/function.header.php
অভিষেক মাধনি

2
আপনার ব্রাউজারে মাইম প্রকার দেয় যাতে আপনি বর্তমান উইন্ডোতে সিএসভির পরিবর্তে ডাউনলোডের মডেল পাবেন।
আলাইন টাইম্বলো

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

প্রথমে আপনাকে মাইএসকিএল সার্ভার থেকে একটি অ্যারেতে ডেটা লোড করতে হবে


10
অথবা, আপনি স্ট্যান্ডার্ড ফেচ এসোসিয়েশন লুপের অভ্যন্তরে fputcsv () করতে পারেন এবং ফিরে আসা ফলাফলগুলি থেকে সরাসরি এড়িয়ে যেতে পারেন।
ড্যাম্প এস

10
@ ড্যাম্প এস 8 এন, একটি বাক্যে "সরাসরি এটি নিচে নামিয়ে" ব্যবহারের জন্য +1 করুন।
অ্যানচোভিলেজেন্ড

এটিকে fppcsv- এর
বেনক

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 সারিগুলির নিচে সূক্ষ্মভাবে কাজ করেছিল, তবে ডেটা বড় হলে ব্যর্থ হয়।



8

100 টিরও বেশি লাইনের সাথে কাজ করে যদি আপনি শিরোনামগুলিতে ফাইলের আকার নির্দিষ্ট করেন তবে নিজের শ্রেণিতে get () পদ্ধতিটি কল করুন simple

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

ঠিক যেমন @ ড্যাম্পেস ৮ এন বলেছেন:

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

আশাকরি এটা সাহায্য করবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.