2012-10-04 22 views
7

मैं हमारे ग्राहकमैं fputcsv द्वारा उपयोग की जाने वाली रेखा समाप्ति को कैसे बदल सकता हूं?

$output = fopen('php://output', 'w'); 

का उपयोग कर और एक CSV फ़ाइल जो ग्राहक द्वारा डाउनलोड किया जाता है करने के लिए डेटा लिखने के लिए fputcsv() का उपयोग करके डाउनलोड के लिए एक CSV फ़ाइल बनाने के।

मैं लिनक्स पर PHP चला रहा हूं और इसके परिणामस्वरूप लाइन एंडिंग का अर्थ कई विंडोज अनुप्रयोगों द्वारा नहीं किया गया है।

मैं सर्वर पर एक निर्देशिका करने के लिए CSV फ़ाइल लिख सकता है, तो उसे वापस पढ़ सकते हैं और \r\n को \n से एक str_replace() करते हैं, लेकिन इस समस्या के हल के लिए एक नहीं बल्कि भद्दा तरीका लगता है। क्या भौतिक फ़ाइल बनाने के बिना रूपांतरण करने का कोई तरीका है?

+0

जब तक उपयोगकर्ता में फ़ाइल खोल रहा है है एक विंडोज टेक्स्ट एडिटर जिसके लिए सीआरएलएफ, या कुछ सुंदर पुराने विंडोज ऐप्स की आवश्यकता होती है, तो यह वास्तव में कोई फर्क नहीं पड़ता ... अधिकांश विंडोज़ एप्लिकेशन इन दिनों एक साधारण एलएफ को पहचानते हैं –

+1

+1 के लिए खेद है कि आप 1337 पर थे, सबसे खूबसूरत प्रतिनिधि । लेकिन आपका प्रश्न मुझे रूचि देता है, बचने वाले चार को भी बदलने का कोई तरीका नहीं ... –

+0

@ मार्कबकर: हाँ, यही मेरी अपेक्षा है। दुर्भाग्यवश, वे कुछ एमआईएस में सीएसवी आयात कर रहे हैं, जो इस संबंध में नोटपैड से ज्यादा स्मार्ट नहीं दिखते हैं। – Kalessin

उत्तर

17

आप धारा इस्तेमाल कर सकते हैं इसे पूरा करने के लिए फ़िल्टर। यह उदाहरण एक भौतिक फ़ाइल को लिखता है, लेकिन इसे php://output के लिए भी ठीक काम करना चाहिए।

// filter class that applies CRLF line endings 
class crlf_filter extends php_user_filter 
{ 
    function filter($in, $out, &$consumed, $closing) 
    { 
     while ($bucket = stream_bucket_make_writeable($in)) { 
      // make sure the line endings aren't already CRLF 
      $bucket->data = preg_replace("/(?<!\r)\n/", "\r\n", $bucket->data); 
      $consumed += $bucket->datalen; 
      stream_bucket_append($out, $bucket); 
     } 
     return PSFS_PASS_ON; 
    } 
} 
// register the filter 
stream_filter_register('crlf', 'crlf_filter'); 

$f = fopen('test.csv', 'wt'); 
// attach filter to output file 
stream_filter_append($f, 'crlf'); 
// start writing 
fputcsv($f, array('1 1', '2 2')); 
fclose($f); 
2

सुनिश्चित नहीं है कि आप इसे PHP के साथ ही कर सकते हैं। फाइल लेखन के लिए PHP के ईओएल को बदलने का एक तरीका हो सकता है, लेकिन शायद यह सिस्टम निर्भर है। आपके पास एक विंडोज सिस्टम नहीं है जिसे आप पिंग कर सकते हैं, है ना? ;)

कोई वास्तविक समाधान के लिए के रूप में, के बजाय str_replace पंक्ति-दर-पंक्ति, आप लिनक्स कार्यक्रम unix2dos (dos2unix का प्रतिलोम) का उपयोग संभालने सकता है आप इसे स्थापित किया है:

fputcsv($fh ...) 
exec("unix2dos " . escapeshellarg($filename)); 
1
  1. \ N लाइन अंत के साथ फ़ाइल एक Linux मशीन पर
  2. एफ़टीपी एक Windows मशीन
  3. को Linux मशीन से ASCII के रूप में फ़ाइल बनाएँ अरे Presto! सभी लाइन अंत अब कर रहे हैं \ Windows मशीन पर फ़ाइल में r \ n
-1

फ़ाइल लेखन के बजाय, एक बेहतर समाधान का उपयोग करने के उत्पादन बफरिंग

function output($buffer) { 
    return str_replace("\r", "\r\n", $buffer); 
} 

ob_start('output'); 
fputcsv(....); 
संबंधित मुद्दे

 संबंधित मुद्दे