PHP Array CSV में


104

मैं उत्पादों की एक सरणी को एक CSV फ़ाइल में बदलने की कोशिश कर रहा हूँ, लेकिन यह योजना नहीं बन रही है। CSV फ़ाइल एक लंबी लाइन है, यहाँ मेरा कोड है:

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

$ जानकारी का उपयोग करें [] = $ परिणाम-> fetch_array (); अन्यथा इसका अंतिम उत्पाद विवरण होगा
GBD

@ जॉनीफाल्डो: धन्यवाद आदमी! बस मुझे इसकी आवश्यकता थी।
सेसर

अरे! मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन आप अपने प्रश्न का उत्तर दे सकते हैं। यह एक समान समस्या का हल खोजने में लोगों की मदद कर सकता है।
गुस्तावो स्ट्राबे

क्या किसी और को पहली लाइन मिल रही है और दूसरी लाइन के पहले दो ब्लॉक खाली हैं ??
मच 2

जवाबों:


97

लिखने के बजाय मूल्यों का उपयोग करने पर विचार करें fputcsv()

इससे आपकी समस्या तुरंत हल हो सकती है।


1
मुझे यह उल्लेख करना चाहिए कि यह आपके सर्वर पर एक फ़ाइल बना रहा है, इसलिए आपको इसे आउटपुट करने से पहले उस फ़ाइल की सामग्री को पढ़ना होगा, यदि आप कॉपी को सहेजना नहीं चाहते हैं तो आपको ùnlink`the फ़ाइल की आवश्यकता होगी जब आप कर चुके हैं।
मार्टिन लिन

Vyktor संपादित करने के लिए धन्यवाद, मेरी टाइपिंग आज भयानक है! मैं आमतौर पर इतना सावधान हूँ।
मार्टिन लिन

क्या मैं ऐसा करने के लिए ऊपर दिए गए कोड को संपादित कर सकता हूं? के रूप में यह सभी क्षेत्रों outputting है, और मैनुअल के fputcsv के उदाहरण का उपयोग कर मैं यह करने के लिए नहीं मिल सकता है
JohnnyFaldo

7
array_to_CSV ($ डेटा); फ़ंक्शन array_to_CSV ($ डेटा) {$ outstream = fopen ("php: // output", 'r + +); fputcsv ($ outstream, $ डेटा, '', '' '); रिवाइंड ($ outstream); $ सीएसवी = fgets ($ outstream); fclose ($ outstream); वापसी $ सीएसवी;}
JohnnyFaldo

हां, जिसने इसे धन्यवाद दिया, आपने मूल प्रश्न में समाधान जोड़ा है
जॉनीफाल्डो

16

यह एक सरल समाधान है जो csv स्ट्रिंग के लिए एक सरणी निर्यात करता है:

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

अपने CSV आउटपुट में प्रत्येक नई पंक्ति को समाप्त करने के लिए।

मैं मान रहा हूं कि पाठ परिसीमन कर रहा है, लेकिन अगली पंक्ति में नहीं जा रहा है?

यह एक PHP निरंतर है। यह आपके लिए आवश्यक पंक्ति का सही अंत निर्धारित करेगा।

उदाहरण के लिए, विंडोज़, "\ r \ n" का उपयोग करता है। मैंने अपने दिमाग को उस एक के साथ मिटा दिया जब मेरा आउटपुट एक नई पंक्ति में नहीं टूट रहा था।

PHP में यूनिफाइड नई लाइन कैसे लिखें?


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 . '",';
        }
    }
}

चूँकि मेरे सरणी के विभिन्न स्तरों ने अपने आप को फ्लैट CSV प्रारूप में अच्छी तरह से उधार नहीं दिया था, इसलिए मैंने डेटा के अगले स्तर के लिए एक वर्णनात्मक "परिचय" के रूप में सेवा करने के लिए उप-सरणी की कुंजी के साथ एक खाली कॉलम बनाया। नमूना उत्पादन:

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 () के बाद कोड को आगे कॉम्पैक्ट करने और अतिरिक्त कॉलम को हटाने के लिए।

चूंकि मैं एक शीर्षक पंक्ति और डेटा पंक्ति दोनों चाहता था, इसलिए मैं फ़ंक्शन में दो चर पास करता हूं और फ़ंक्शन को कॉल पूरा करने पर दोनों को PHP_EOL के साथ समाप्त करता हूं:

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

हां, मुझे पता है कि मैं एक अतिरिक्त अल्पविराम छोड़ देता हूं, लेकिन संक्षिप्तता के लिए, मैंने इसे यहां नहीं संभाला।


यह एक बहुत ही सामान्य प्रश्न के लिए एक विशिष्ट उत्तर की तरह लगता है और आपने स्वीकार किया कि अतिरिक्त कॉमा (एरियर्स के बजाय स्ट्रिंग्स का उपयोग करने के वास्तविक मुद्दे के कारण) के साथ-साथ हेडर लाइन को उद्धृत नहीं किया था और कुछ अतिरिक्त अनावश्यक कॉल की थी। मैंने एक और सवाल के जवाब के अंदर यह सब फिर से दोहराया ।
LWC

1

Php फ़ंक्शन 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);```
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.