সিএসভিতে পিএইচপি অ্যারে


104

আমি পণ্যগুলির একটি অ্যারেটিকে একটি সিএসভি ফাইলে রূপান্তরিত করার চেষ্টা করছি, তবে এটির পরিকল্পনা হবে বলে মনে হচ্ছে না। সিএসভি ফাইলটি একটি দীর্ঘ লাইন, এখানে আমার কোডটি রয়েছে:

for($i=0;$i<count($prods);$i++) {
$sql = "SELECT * FROM products WHERE id = '".$prods[$i]."'";
$result = $mysqli->query($sql);
$info = $result->fetch_array(); 
}

$header = '';

for($i=0;$i<count($info);$i++)  
  {
    $row = $info[$i];

    $line = '';
    for($b=0;$b<count($row);$b++)
    { 
    $value = $row[$b];                                      
        if ( ( !isset( $value ) ) || ( $value == "" ) )
        {
            $value = "\t";
        }
        else
        {
            $value = str_replace( '"' , '""' , $value );
            $value = '"' . $value . '"' . "\t";
        }
         $line .= $value;
        }
    $data .= trim( $line ) . "\n";
}
$data = str_replace( "\r" , "" , $data );

if ( $data == "" )
{
$data = "\n(0) Records Found!\n";                        
}

header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=your_desired_name.xls");
header("Pragma: no-cache");
header("Expires: 0");

array_to_CSV($data);


function array_to_CSV($data)
    {
        $outstream = fopen("php://output", 'r+');
        fputcsv($outstream, $data, ',', '"');
        rewind($outstream);
        $csv = fgets($outstream);
        fclose($outstream);
        return $csv;
    }

এছাড়াও, শিরোনাম কোনও ডাউনলোডকে জোর করে না। আমি আউটপুট অনুলিপি এবং আটকানো এবং .csv হিসাবে সংরক্ষণ করা হয়েছে

সম্পাদনা

সমস্যা সমাধান:

অন্য কেউ যদি একই জিনিসটির সন্ধান করে, এটি করার আরও ভাল উপায় খুঁজে পেয়েছিল:

$num = 0;
$sql = "SELECT id, name, description FROM products";
if($result = $mysqli->query($sql)) {
     while($p = $result->fetch_array()) {
         $prod[$num]['id']          = $p['id'];
         $prod[$num]['name']        = $p['name'];
         $prod[$num]['description'] = $p['description'];
         $num++;        
    }
 }
$output = fopen("php://output",'w') or die("Can't open php://output");
header("Content-Type:application/csv"); 
header("Content-Disposition:attachment;filename=pressurecsv.csv"); 
fputcsv($output, array('id','name','description'));
foreach($prod as $product) {
    fputcsv($output, $product);
}
fclose($output) or die("Can't close php://output");

$ তথ্য ব্যবহার করুন [] = $ ফলাফল-> ফেচ_আরে (); অন্যথায় এটিতে সর্বশেষ পণ্যের বিবরণ থাকবে
জিবিডি

@ জোহনিফাল্ডো: ধন্যবাদ মানুষ! আমার যা দরকার ছিল ঠিক তাই।
সিজার

আরে! আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আপনি নিজের প্রশ্নের উত্তর দিতে পারেন। এটি লোকেদের অনুরূপ সমস্যার সমাধান খুঁজতে সহায়তা করতে পারে।
গুস্তাভো স্ট্রুব

অন্য লাইনের দ্বিতীয় লাইনের প্রথম দুটি লাইন ফাঁকা পেয়ে অন্য কেউ কি ??
mach2

উত্তর:


97

পরিবর্তে মান লেখার পরিবর্তে ব্যবহার বিবেচনা করুন fputcsv()

এটি আপনার সমস্যার সাথে সাথে সমাধান করতে পারে।


1
আমার উল্লেখ করা উচিত যে এটি আপনার সার্ভারে একটি ফাইল তৈরি করবে, সুতরাং আউটপুট দেওয়ার আগে আপনাকে সেই ফাইলের বিষয়বস্তু পড়তে হবে, এছাড়াও যদি আপনি কোনও অনুলিপি সংরক্ষণ করতে না চান তবে আপনাকে ফাইলটি আনলিংক করতে হবে যখন তুমি পেরেছ.
মার্টিন লেন

ভাইক্টর সম্পাদনার জন্য ধন্যবাদ, আমার টাইপিং আজ ভয়াবহ! আমি সাধারণত খুব সাবধান।
মার্টিন লেন

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

7
অ্যারে_ টো_সিএসভি ($ ডেটা); ফাংশন অ্যারে_টো_সিএসভি ($ ডেটা) $ t আউটসেট্রিম = ফোপেন ("পিএইচপি: // আউটপুট", 'আর +'); fputcsv ($ আউটস্ট্রিম, $ ডেটা, ',', '""); রিওয়াইন্ড ($ আউটস্ট্রিম); $ csv = fgets ($ আউটস্ট্রিম); fclose ($ আউটস্ট্রিম); ফিরতি $ csv;}
জননিফাল্ডো

হ্যাঁ এটি সমাধান করেছে এটি আপনাকে ধন্যবাদ, মূল প্রশ্নের সমাধানটি যুক্ত করেছেন
জনিফাল্ডো

16

এটি সিএসভি স্ট্রিংয়ে একটি অ্যারে রফতানি করে এমন একটি সহজ সমাধান:

function array2csv($data, $delimiter = ',', $enclosure = '"', $escape_char = "\\")
{
    $f = fopen('php://memory', 'r+');
    foreach ($data as $item) {
        fputcsv($f, $item, $delimiter, $enclosure, $escape_char);
    }
    rewind($f);
    return stream_get_contents($f);
}

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

5

ব্যবহার করার চেষ্টা করুন;

PHP_EOL

আপনার সিএসভি আউটপুটে প্রতিটি নতুন লাইন শেষ করতে।

আমি ধরে নিচ্ছি যে পাঠ্যটি সীমান্তে রয়েছে, কিন্তু পরবর্তী সারিতে চলে যাচ্ছে না?

এটি একটি পিএইচপি ধ্রুবক। এটি আপনার প্রয়োজনীয় লাইনের সঠিক শেষটি নির্ধারণ করবে।

উইন্ডোজ, উদাহরণস্বরূপ, "\ r \ n" ব্যবহার করে। যখন আমার আউটপুট কোনও নতুন লাইনে না ভেঙেছিল তখন আমি সেই সাথে আমার মস্তিষ্কগুলি জড়িয়ে রেখেছিলাম।

পিএইচপি-তে কীভাবে ইউনিফাইড নতুন লাইন লিখবেন?


2

আমি জানি এটি পুরানো, আমার একটি কেস ছিল যেখানে আমাকে সিএসভিতে অন্তর্ভুক্ত করার জন্য অ্যারে কীটি প্রয়োজন ছিল, তাই আমি জেসি কি দ্বারা স্ক্রিপ্টটি আপডেট করেছি এটি করতে। আমি আউটপুট হিসাবে একটি স্ট্রিং ব্যবহার করেছি, যেহেতু ইমপ্লোড নতুন লাইন যুক্ত করতে পারে না (নতুন লাইন এমন কিছু যা আমি যুক্ত করেছি এবং সত্যই সেখানে থাকা উচিত)।

দয়া করে মনে রাখবেন, এটি কেবল একক মান অ্যারে নিয়ে কাজ করে (key, value)। তবে বহুমাত্রিক হ্যান্ডেল করতে সহজেই আপডেট করা যেতে পারে (key, array())

function arrayToCsv( array &$fields, $delimiter = ',', $enclosure = '"', $encloseAll = false, $nullToMysqlNull = false ) {
    $delimiter_esc = preg_quote($delimiter, '/');
    $enclosure_esc = preg_quote($enclosure, '/');

    $output = '';
    foreach ( $fields as $key => $field ) {
        if ($field === null && $nullToMysqlNull) {
            $output = '';
            continue;
        }

        // Enclose fields containing $delimiter, $enclosure or whitespace
        if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field ) ) {
            $output .= $key;
            $output .= $delimiter;
            $output .= $enclosure . str_replace($enclosure, $enclosure . $enclosure,     $field) . $enclosure;
            $output .= PHP_EOL;
        }
        else {
            $output .= $key;
            $output .= $delimiter;
            $output .= $field;
            $output .= PHP_EOL;
        }
    }

    return  $output ;
}

1

আমার ক্ষেত্রে, আমার অ্যারেটি বহুমাত্রিক ছিল, সম্ভাব্যত মান হিসাবে অ্যারে ছিল। সুতরাং আমি অ্যারেটিকে পুরোপুরি উড়িয়ে দিতে এই পুনরাবৃত্ত ফাংশনটি তৈরি করেছি:

function array2csv($array, &$title, &$data) {
    foreach($array as $key => $value) {      
        if(is_array($value)) {
            $title .= $key . ",";
            $data .= "" . ",";
            array2csv($value, $title, $data);
        } else {
            $title .= $key . ",";
            $data .= '"' . $value . '",';
        }
    }
}

যেহেতু আমার অ্যারের বিভিন্ন স্তর ফ্ল্যাট সিএসভি ফর্ম্যাটে নিজেকে ভাল ধার দেয় না, তাই উপ-অ্যারের কী সহ আমি একটি ফাঁকা কলাম তৈরি করেছি পরবর্তী স্তরের ডেটা বর্ণনামূলক "পরিচয়" হিসাবে পরিবেশন করতে। নমুনা আউটপুট:

agentid     fname           lname      empid    totals  sales   leads   dish    dishnet top200_plus top120  latino  base_packages
G-adriana   ADRIANA EUGENIA PALOMO PAIZ 886                0    19              0         0         0         0      0

আপনি সহজেই সেই "পরিচিতি" (বর্ণনামূলক) কলামটি সরিয়ে ফেলতে পারেন, তবে আমার ক্ষেত্রে আমার প্রতিটি সাব-অ্যারেতে কলামের শিরোনামগুলি, অর্থাত্ ইনবাউন্ড_লিয়েডগুলি পুনরাবৃত্তি হয়েছিল, যাতে পরবর্তী বিভাগের পূর্ববর্তী একটি বিরতি / শিরোনাম আমাকে দিয়েছিল। অপসারণ:

$title .= $key . ",";
$data .= "" . ",";

কোডটি আরও কমপ্যাক্ট করতে এবং অতিরিক্ত কলামটি সরানোর জন্য is_array () এর পরে।

যেহেতু আমি একটি শিরোনাম সারি এবং ডেটা সারি উভয়ই চেয়েছিলাম, তাই আমি ফাংশনটিতে এবং দুটি ফাংশনটিতে কলটি শেষ করার পরে, দুটি পিএইচপি_ইওএল দিয়ে শেষ করব:

$title .= PHP_EOL;
$data .= PHP_EOL;

হ্যাঁ, আমি জানি আমি একটি অতিরিক্ত কমা রেখেছি, তবে ব্রেভিটির জন্য, আমি এটি এখানে পরিচালনা করি নি।


এটি খুব সাধারণ প্রশ্নের সুনির্দিষ্ট উত্তরের মতো বলে মনে হচ্ছে এবং আপনি স্বীকৃতভাবে অতিরিক্ত কমা ছেড়ে দিয়েছেন (অ্যারের পরিবর্তে স্ট্রিংগুলি ব্যবহারের আসল ইস্যুর কারণে) পাশাপাশি শিরোনামের লাইনটি উদ্ধৃত করেননি এবং কিছু অতিরিক্ত বিনাবিযুক্ত কল পেয়েছিলেন। আমি অন্য একটি প্রশ্নের উত্তরের ভিতরে এই সমস্তটি পুনরায় আকার দিয়েছি ।
এলডাব্লুসি

1

'টেক্সট / CSV' বিন্যাস ডেটার অ্যারেগুলির CSV রূপান্তরিত হয় পিএইচপি ফাংশন fputcsv সালে নির্মিত এবং কমা, কোট যত্ন ইত্যাদি .. লাগে
তাকান
https://coderwall.com/p/zvzwwa/array-to-comma-separated -string-in-php
http://www.php.net/manual/en/function.fputcsv.php


একটি সমাধানের একটি লিঙ্ক স্বাগত, তবে দয়া করে আপনার উত্তরটি কার্যকর না হওয়া নিশ্চিত করুন: লিঙ্কটির চারপাশে প্রসঙ্গটি যুক্ত করুন যাতে আপনার সহ ব্যবহারকারীদের কিছু ধারণা থাকতে পারে এটি কী এবং কেন এটি রয়েছে, তারপরে আপনি পৃষ্ঠার সর্বাধিক প্রাসঙ্গিক অংশটি উদ্ধৃত করুন লক্ষ্য পৃষ্ঠাটি অনুপলব্ধ ক্ষেত্রে লিঙ্কটি পুনরায় সংযুক্ত করুন। লিঙ্কের চেয়ে সামান্য বেশি উত্তর মুছতে পারে।
geisterfurz007

0

এটা আমার জন্য কাজ করে।

 $f=fopen('php://memory','w');
 $header=array("asdf ","asdf","asd","Calasdflee","Start Time","End Time" );      
 fputcsv($f,$header);
 fputcsv($f,$header);
 fputcsv($f,$header); 
 fseek($f,0);
 header('content-type:text/csv'); 
 header('Content-Disposition: attachment; filename="' . $filename . '";');
 fpassthru($f);```
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.