2011-01-19 10 views
12

पर विचार करें रों सीएसवी इसकैसे पीएचपी एक स्तंभ में बहु डेटा होने में सीएसवी पार्स करने के लिए

item1,"description 1" 
item2,"description 2" 
item3,"description 3 
description 3 continues on new line" 
item4,"description 4" 

जो इस

item1,"description 1" 
item2,"description 2" 
item3,"description 3 description 3 continues on new line" 
item4,"description 4" 

तरह पार्स किया जाना चाहिए की तरह फाइल वहाँ में इस CSV पार्स करने के लिए एक रास्ता है PHP जिसमें बहुमुखी मूल्य हैं?

+0

एक पार्सर लिखें? –

+0

@goreSplatter, या बस एक मौजूदा का उपयोग करें। –

+0

@ बार्ट क्षमा करें मैंने अन्य स्पष्ट समाधान छोड़ दिया। –

उत्तर

8

fgetcsv इसे सही तरीके से पार्स करने में सक्षम होना चाहिए।
मैं इसे हाथ से ऐसा करने की अनुशंसा नहीं करता, वैसे भी सीएसवी को पार्स करने में ऐसे कई मिलचास हैं।

+2

समस्या यह है कि मैं फ़ाइल से fgets पढ़ने लाइन का उपयोग कर रहा था, फिर str_getcsv स्ट्रिंग को पार्स करने के बजाय केवल fgetcsv का उपयोग कर। यह सिंगल लाइन कॉलम के साथ ठीक काम कर रहा था लेकिन मल्टीलाइन नहीं। यहां तक ​​कि कठिन PHP.net का कहना है कि fgetcsv "फ़ाइल से लाइन प्राप्त करता है" ऐसा लगता है कि "रेखा" यहां सादे पाठ फ़ाइल में वास्तविक रेखा नहीं है बल्कि सभी बहुमुखी डेटा के साथ पूरी वास्तविक पंक्ति है। – Ergec

+0

मैं आज एक ही मुद्दे के साथ आया और थोड़ा [टेस्ट] (http://phpfiddle.org/main/code/rd6-new) बनाया, जो _lines_ के बारे में आपके कथन को _csv-rows_ का संदर्भ देता है और वास्तविक _file- lines_। – Raoul

8

यहां कुछ काम करने वाले उदाहरण हैं कि इसे कैसे करें।

स्ट्रिंग चर $ CsvString में सीएसवी:

$fp = tmpfile(); 
fwrite($fp, $CsvString); 
rewind($fp); //rewind to process CSV 
while (($row = fgetcsv($fp, 0)) !== FALSE) { 
    print_r($row); 
} 

फ़ाइल में सीएसवी: मैं fgetcsv उपयोग कर रहा हूँ

if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    while (($row = fgetcsv($handle, 0, ",")) !== FALSE) { 
    print_r($row); 
    } 
    fclose($handle); 
} 
+0

उत्कृष्ट जवाब। मेरे पास उपयोगकर्ता द्वारा सीएसवी अपलोड किया गया है \ r लाइन एंडिंग्स (मुझे कोई जानकारी नहीं है), और सीएसवी को पार्स करने से पहले स्ट्रैपस्थल करना पड़ा। चूंकि str_getcsv एकाधिक लाइनों को संभाल नहीं पाता है, और कुछ पंक्तियों में उनमें नई लाइनें होती हैं, यह (हैकिश करते समय, एक अस्थायी फ़ाइल में सामान डालकर बस PHP पार्स बनाने के लिए) काम करता है। – csga5000

6

StanleyD जवाब है, लेकिन करने के लिए लिखने की तुलना में एक अस्थायी स्मृति ब्लॉक (का इस्तेमाल करके उनकी आधार पर डिस्क) बेहतर प्रदर्शन के लिए:

$fp = fopen('php://temp','r+'); 
fwrite($fp, $CsvString); 
rewind($fp); //rewind to process CSV 
while (($row = fgetcsv($fp, 0)) !== FALSE) { 
    print_r($row); 
} 
संबंधित मुद्दे

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