2010-09-28 10 views
10

के साथ उत्पन्न सीआरवी मानों को लपेटें तो, मेरा कोड PHP के अंतर्निहित fputcsv फ़ंक्शन का उपयोग कर एक CSV फ़ाइल उत्पन्न करता है।PHP fputcsv() द्वारा

डेलीमीटर के लिए, मैं ',' (एक अल्पविराम) का उपयोग करता हूं।
संलग्नक के लिए, मैं '"' (एक डबल-कोट) का उपयोग करता हूं।

हालांकि

, जब मैं कोशिश की तरह

fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"'); 

में कुछ यह आउटपुट

a,b,"long string, with commas",, 

लेकिन मैं यह उत्पादन

"a","b","long string, with commas","","" 

चाहते हैं कि इस से निपटने के लिए एक आसान तरीका है , या मुझे fputcsv के लिए एक प्रतिस्थापन लिखना होगा?

+1

उत्पादन मान्य CSV है। आपका दूसरा टूल टूटा हुआ है। –

+0

आप हर क्षेत्र में उद्धरण क्यों चाहते हैं? –

+1

@Ignacio, एंड्रयू: जाहिर है, स्प्रेडशीट सॉफ्टवेयर पर आयात संवाद के एक छोटे से कोने में छिपा कई रिक्त फ़ील्ड गाढ़ा करने के लिए एक विकल्प है ('एक ,,,' => 'एक,') और/या उन्हें हटाने ('एक , '=>' ए')। और जाहिरा तौर पर कुछ उपयोगकर्ताओं को इस जाँच की है और यह पता नहीं है, इतना आसान, एक आकार फिट सभी समाधान एक खाली स्ट्रिंग ('एक," "," "," "' होने के लिए प्रत्येक खाली क्षेत्र के लिए मजबूर करने के लिए है)। –

उत्तर

9

यह आमतौर पर सीएसवी फाइलों के लिए एक समस्या नहीं है।

fputcsv मूल्य के चारों ओर उद्धरण डालता है अगर यह संदिग्ध होगा। उदाहरण के लिए,

a,b,"long string, with commas",, 

अस्पष्ट नहीं है, लेकिन,

a,b,long string, with commas,, 

है, और ज्यादातर में (पढ़ें: सभी) होगा मामलों अधिक से अधिक 5 क्षेत्रों होने के रूप में सीएसवी पाठक द्वारा व्याख्या की जा।

सीएसवी पार्सर्स उनके चारों ओर उद्धरण के बिना भी स्ट्रिंग अक्षर स्वीकार करेंगे।

यदि आप मूल्यों के चारों ओर उद्धरण चाहते हैं, तो निम्न स्निपेट ऐसा करेगा। यह उद्धरण से बच नहीं है स्ट्रिंग के अंदर - कि व्यायाम पाठक के लिए छोड़ दिया जाता है:

$row = '"' . implode('", "', $rowitems) . '"'; 

आप अपने सभी पंक्तियों के लिए एक पाश में इस डाल करने के लिए चाहते हैं।

+0

हाँ, मैं अस्पष्टता के बारे में पता है, लेकिन यह वास्तव में खाली भागों है कि मैं उद्धरण में लिपटे की जरूरत है। मैं बिना खाली हिस्सों को लपेटा जा सकता हूं (निश्चित रूप से संदिग्ध लोगों को छोड़कर)। –

+0

आपकी टिप्पणी उलझन में है। आप खाली भागों उद्धरण में लिपटे लेकिन गैर खाली भागों लपेटकर के बिना जा सकते हैं करना चाहते हैं? आपका क्या मतलब है। पोस्ट किया गया स्निपेट सभी उद्धरणों में लपेट जाएगा जो सभी सीएसवी पार्सर्स के साथ काम करना चाहिए। –

+0

कोई बात नहीं। मैं उलझन में था। हाँ, यह काम करना चाहिए। धन्यवाद। –

0

कोई कारण नहीं है कि आप str_replace (',', ',' ", ', $ आउटपुट नहीं कर सकते); ? तुम भी अगर पिछले या पहले वर्ण एक अल्पविराम है देखने के लिए होगा और यदि हां, तो साथ अल्पविराम, ""

+0

यह वास्तव में मेरा पहला विचार था, लेकिन फिर मुझे एक स्ट्रिंग में फ़ाइल-लेखन को रोकना होगा। डी: –

+1

आह हाँ। पूरी तरह से fputcsv वास्तव में क्या करता है के बारे में सोचना भूल गया। आप अपने स्वयं के फ़ंक्शन को लिखने से बेहतर हैं जो डेटा से बच निकलता है और इसे फ़ूट्स या फ़्राइट का उपयोग करके आउटपुट करता है। – methodin

2

मुझे लगता है कि समाधान इस की तरह होगा,

$order_header_arr = array("Item1", "Item2","This is Item3"); 
fputcsv($fp, $order_header_arr,',',' '); 

याद " " [स्पेस की जगह ] Fputcsv

+0

यह सबसे साफ और तेज़ उत्तर – RafaSashi

8

के तीसरे पैरामीटर के बीच मैंने कुछ जगहों के साथ कुछ बोगस स्ट्रिंग वर्ण डालने के द्वारा काम किया, # @ @ #, और फिर उन्हें हटा दिया।

//$exported is our array of data to export 
$filename = 'myfile.csv'; 
$fp = fopen($filename, 'w'); 
foreach ($exported as $line => $row) { 
    if ($line > 0) { 
     foreach ($row as $key => $value) { 
       $row[$key] = $value."#@ @#"; 
     } 
    } 
    fputcsv($fp, $row); 
} 

fclose($fp); 
$contents = file_get_contents($filename); 
$contents = str_replace("#@ @#", "", $contents); 
file_put_contents($filename, $contents); 

इस दोहरे उद्धरण में सभी क्षेत्रों, खाली लोगों

+0

है हालांकि इसमें फ़ाइल को खोलने और बंद करने में एक अतिरिक्त समय है जो यह अच्छी तरह से काम करता है। – iamjonesy

+0

यह आपको सभी स्तंभों की बजाय किसी विशिष्ट फ़ील्ड के लिए सेट करने देता है +1 – input

+0

थोड़ा धीमा लेकिन इसके लिए ठीक से काम करने का एकमात्र तरीका धन्यवाद! – Damian

0

fputcsv उद्धरण में सभी सरणी चर संलग्न नहीं होंगे सहित encloses: यहां नमूने के कार्यान्वयन है। उद्धरण के बिना एक संख्यात्मक सरणी मान होने पर सही हो सकता है लेकिन एक समस्या प्रस्तुत करता है जब कोई लेबल या पता प्रोग्राम संख्यात्मक परिभाषित यूएस ज़िप कोड का सामना करता है क्योंकि यह मुद्रण करते समय प्रमुख शून्य को पट्टी कर देगा। इस प्रकार 05123-0019 5123-19 बन गया।

सभी मूल्यों संलग्न करने के लिए, चाहे वे मौजूद हैं या नहीं, उद्धरण में मैं fgetsrc साथ इनपुट फ़ाइल पढ़ सकते हैं और fwrite का उपयोग कर एक सही संस्करण लिखें। fgetsrc सरणी चर में रिकॉर्ड पढ़ता है। चूंकि fwrite एक चर लिखता है, इसलिए आपको सरणी चर को स्ट्रिंग करना होगा, उन्हें उद्धरणों में संलग्न करना होगा और सरणी चर को अल्पविराम से अलग करना होगा। फिर रिकॉर्ड विभाजक जोड़ें।

<?php 
// fgetcsv - read array with fgetcsv and string into output variable 
// then write with fwrite 
// $ar is the array populated from fgetcsv and $arc is the variable strung 
// with array variables enclosed in quotes and written using fwrite. 
$file_in = fopen("reinOCp.csv","r") or die("Unable to open input file 
reinOCp.csv!"); 
$file_out = fopen("printLABEL.csv", "w") or die("Unable to open output file 
prtLABEL!"); 
while (!feof($file_in)) { //loop through each record of the input file 
    $ar=fgetcsv($file_in); //read the record into array $ar 
    if (is_array($ar)){ //this loop will string all the array values plus 
// the end of record into variable $arc and then write the variable 
     $arc = ""; //clear variable $arc 
     foreach ($ar as $value) {  
      $arc .= '"' . $value . '",'; // add the array values, enclose in 
// quotes with comma separator and store in variable $arc 
     } 
     $arc .= "\n"; //add end of record to variable $arc 
     fwrite($file_out, $arc) or die ("ERROR: Cannot write the file"); 
//write the record using variable $arc 
    } 
} 
echo "end of job"; 
fclose($file_in); 
fclose($file_out); 
?> 
संबंधित मुद्दे