কীভাবে পিএইচপি স্ক্রিপ্ট থেকে সিএসভি ফাইল তৈরি ও ডাউনলোড করবেন?


92

আমি একজন শিক্ষানবিস প্রোগ্রামার এবং আমি আমার প্রশ্ন সম্পর্কে অনেকগুলি অনুসন্ধান করেছি কিন্তু এই সম্পর্কে একটি সহায়ক সমাধান বা টিউটোরিয়াল খুঁজে পাইনি।

আমার লক্ষ্যটি হল আমার কাছে একটি পিএইচপি অ্যারে রয়েছে এবং অ্যারের উপাদানগুলি পৃষ্ঠার একটি তালিকায় প্রদর্শিত হচ্ছে।

আমি একটি বিকল্প যুক্ত করতে চাই, যাতে কোনও ব্যবহারকারী চাইলে সে অ্যারে উপাদানগুলির সাথে একটি সিএসভি ফাইল তৈরি করতে এবং ডাউনলোড করতে পারে।

আমি জানি না এটি কীভাবে করা যায়। আমি অনেক অনুসন্ধান করেছি। তবে এখনও কোনও সহায়ক সংস্থান খুঁজে পাওয়া যায়নি।

এটি নিজের দ্বারা প্রয়োগ করার জন্য দয়া করে আমাকে কিছু টিউটোরিয়াল বা সমাধান বা পরামর্শ দিন। আমি যেহেতু একজন শিক্ষানবিস তাই দয়া করে সমাধানগুলি কার্যকর করার সহজ সরবরাহ করুন।

আমার অ্যারে দেখে মনে হচ্ছে:

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] => 
        )

)

4
সিএসভি ফাইলের জন্য পিএইচপিএক্সেল কিছুটা বেশি .. php.net/manual/en/function.fputcsv.php
ড্যামিয়েন পিরসি

আপনার অ্যারে কাঠামোটি দেখান এবং আমি উপাদানগুলিকে সিএসভিতে পরিণত করার জন্য একটি কোড সরবরাহ করি
অর্ধ-দ্রুত

@ অর্ধ-দ্রুত আমি পোস্টে অ্যারে কাঠামো যুক্ত করেছি
user2302780

4
সিএসভি ফাইলে কীভাবে কলামের শিরোনাম যুক্ত করতে পারেন?
ব্যবহারকারী2302780

উত্তর:


208

আপনি আপনার অ্যারে থেকে সঠিক সিএসভি লাইন তৈরি করতে আপনার অ্যারেগুলির জন্য বিল্ট ইন ফুটপ্যাকসভি () ব্যবহার করতে পারেন , সুতরাং আপনাকে লুপটি এড়িয়ে লাইনগুলি সংগ্রহ করতে হবে, যেমন:

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

ব্রাউজারগুলিকে "এই রূপে সংরক্ষণ করুন" ডায়ালগটি সরবরাহ করতে, আপনাকে এইচটিটিপি শিরোনাম পাঠাতে হবে ( আরএফসিতে এই শিরোনাম সম্পর্কে আরও দেখুন ):

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

4
কেন echoউত্পন্ন সিএসভি লাইনগুলি সরাসরি লুপে নেই?
অ্যালেক্স শেস্তেরভ

4
@ অ্যালেক্সশেস্টেরভ, মূল কারণটি হ'ল fputcsv()উত্পন্ন লাইনটি ফিরে আসে না, এটিতে একটি ফাইল বর্ণনাকারীর প্রয়োজন হবে। আপনি পুনরাবৃত্তি করতে, লিখতে, প্রতিটি পুনরাবৃত্তিতে বাফারটি সাফ করতে পারেন যদিও আপনি মেমরির সীমাবদ্ধ। অথবা পরিবর্তে একটি আসল অস্থায়ী ফাইল ব্যবহার করুন।
জটিল 857

@ জটিল 857 আমি কীভাবে সিএসভির জন্য কলামের শিরোনাম যুক্ত করতে পারি?
ব্যবহারকারী2302780

@ user2302780: আপনি কেবল সারি কলামের নাম দিয়ে আপনার ডেটা উপসর্গ করেন। আপনি ডেটা-অ্যারে থেকে কীগুলি ব্যবহার করতে পারেন যেমন$data = array_merge(array(array_keys($data[0])), $data);
জটিল 857

4
আপনি যখন জোরেজোজগুলি একবার তারের উপর দিয়ে কিছু রেখেছেন এমনটাই প্রত্যাশা করা হবে (যে পিএইচপি দিয়ে জিনিসগুলি আউটপুট আউট করার কাজটি ধারণাগতভাবে বোঝায়) আপনি এটি আর ফিরে যেতে পারবেন না। php://outputদ্বিতীয় আপডেট হওয়া কোড নমুনাটি ব্যবহার করতে ।
জটিল 857

18

@ জটিল 857 সমাধানের উত্তর দেওয়ার মতো যথেষ্ট খ্যাতি আমার নেই। এটি দুর্দান্ত কাজ করে, তবে আমাকে যুক্ত করতে হয়েছিল; কনটেন্ট-ডিসপজিশন শিরোনাম শেষে। এটি ছাড়াই ব্রাউজারটি ফাইলের নামের শেষে দুটি ড্যাশ যুক্ত করে (উদাহরণস্বরূপ "export.csv" এর পরিবর্তে ফাইলটি "export.csv--" হিসাবে সংরক্ষিত হয়ে যায়)। সম্ভবত এটি হেডার লাইনের শেষে it r \ n স্যানিটাইজ করার চেষ্টা করে।

সঠিক লাইনের মতো দেখতে হবে:

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

যদি সিএসভিতে এতে ইউটিএফ -8 অক্ষর থাকে, আপনাকে কনটেন্ট-টাইপ লাইনটি পরিবর্তন করে এনকোডিংটি ইউটিএফ -8 এ পরিবর্তন করতে হবে:

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

এছাড়াও, আমি fseek () এর পরিবর্তে রিওয়াইন্ড () ব্যবহার করা আরও মার্জিত বলে মনে করি:

rewind($f);

আপনার সমাধানের জন্য ধন্যবাদ!


4
--ফাইল ফাইলের
নামটি

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

যদি কোনও ক্ষেত্রের মান থাকে তবে তা ভেঙে যায়, এ কারণেই আমি টিএসভি পছন্দ করি (ট্যাবটি এর চেয়ে কম বিরল, এবং আমরা এটি বা
কোনও

14

এটি আমার প্রকল্পের জন্য ব্যবহৃত ফাংশন এবং এটি প্রত্যাশার মতো কাজ করে।

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

4
ওয়ার্ডপ্রেস সেন্ডহেডার্স হুকটিতে এটি প্রয়োগের চেষ্টা করতে আমার খুব কষ্ট হয়েছিল, যতবারই এটি CSV ফাইলের শেষে সমস্ত বর্তমান পৃষ্ঠা HTML টি যুক্ত করে। এই উত্তরগুলি আমাকে অনেক সাহায্য করে, তবে আমি এটি বাফার অপারেশন ছাড়াই ব্যবহার করি।
ওলেগ আপানোভিচ

ক্লিন আউটপুট বাফারটি আমার জন্য সমস্যাটি সমাধান করেছিল যে এই কোড সারিগুলির শুরুতে এবং গঠিত ফাইলটির শেষে ব্যবহারের আগে খালি সারি ছিল।
শারুনাস বিয়েলস্কিস

8

পিএইচপি অ্যারে সিএসভিতে রূপান্তর করতে নীচের কোডটি ব্যবহার করুন

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

এটি করার একটি উপায় ... আপনি এটি ম্যানুয়ালি করতে পারতেন তবে এই উপায়টি বোঝা এবং পড়ার পক্ষে দ্রুত এবং সহজ।

তারপরে আপনি ফাইলগুলি ছিটিয়ে দেওয়ার জন্য জটিলগুলি 856 কী করছে তা আপনার শিরোনামগুলি পরিচালনা করবেন। তারপরে আপনার আর প্রয়োজন না হলে আনলিংক () ব্যবহার করে আপনি ফাইলটি মুছতে পারবেন বা আপনি ইচ্ছে করলে সার্ভারে রেখে দিতে পারেন।


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