2011-12-01 8 views

उत्तर

4

क्यों फ़ाइल हैंडलर का उपयोग न करें और this question में ऐसा क्यों करें? इसका सरल, तेज़ और बहुत ही कुशल।

$numberOfLines = iterator_count($file); 

समारोह iterator_count अपने दोस्त यहाँ है,:

आप पूरी तरह spl का उपयोग करना चाहिए, तो आप इसे इस तरह

$file = new SplFileObject("/path/to/file.txt"); 
$i = 0; 
while (!$file->eof()) { 
    $i++; 
    $file->next(); 
} 
print "file has " . $i . " lines"; 
+0

मैंने आपके द्वारा अनुशंसित फ़ाइलों को पढ़ने के पारंपरिक तरीके को फॉपेन/fgets का उपयोग किया, धन्यवाद। कभी-कभी मैं कक्षाओं के साथ सब कुछ करने की कोशिश कर रहा हूं जब इसकी आवश्यकता नहीं होती है। –

+0

यदि आप किसी ऑब्जेक्ट उन्मुख तरीके से अपना फ़ाइलहेडलिंग करना चाहते हैं, तो यही कारण है कि एसपीएल क्यों मौजूद है। –

+4

भी ['iterator_count()'] (http://php.net/iterator_count) है। – salathe

3

SplFileObject एक itertor, प्रति पंक्ति एक यात्रा कर सकते हैं प्रदान करता है आपके लिए ट्रैवर्सल करना और पुनरावृत्तियों की संख्या वापस करना।

आप फ़ाइल ऑब्जेक्ट के SKIP_EMPTY flag का उपयोग उस फ़ाइल में खाली लाइनों को गिनने के लिए नहीं कर सकते हैं।

+0

ग्रेट उत्तर लेकिन बड़ी फ़ाइल (इस मामले में 10 एमबी और 135,000+ रेखाएं) पर यह पूरी तरह धीमी है और इस विधि का उपयोग करके गिनने का प्रयास वास्तव में एक समय में परिणाम देता है। – Typo

33

iterator_count और next() का उपयोग करके लाइन-बाय-लाइन पुनरावृत्त उबंटू के तहत मेरे PHP संस्करण 5.3.7 में टूट गया है।

fseek([any offset], SEEK_END) विधि भी टूटा हुआ लगता है। key() रिटर्न 0.

seek($lineCount) का उपयोग कर बड़ी फ़ाइलों पर इटरेट बहुत धीमा है।

Simpliest 5.3.7-सत्यापित रास्ता

// force to seek to last line, won't raise error 
$file->seek($file->getSize()); 
$linesTotal = $file->key(); 

30000 लाइनों की गिनती अब .००,००२ सेकेंड की आवश्यकता है और स्मृति के बारे में 20 केबी शुल्क लगता है।

इटरेशन विधि में लगभग 3 सेकंड लगते हैं।

+0

यह गलत है, तलाशें() लाइन नंबर की तलाश करेंगे जबकि getSize() बाइट्स में फाइलसाइज वापस कर देगा। – Twisted1919

+1

मुझे पता है। यह केवल यह सुनिश्चित करता है कि हमने __all__ फ़ाइल लाइनों की तलाश की है (भले ही वे सभी खाली हों)। सबसे आम मामलों में, तलाश() लाइन नंबर पर ईओएफ पर टक्कर लगी होगी जो निश्चित रूप से बाइट्स गिनती से कम है, लेकिन PHP इसे चुपचाप संभालती है, अंतिम पंक्ति संख्या लौटाती है। सहमत हैं, यह गंदा हैक है, लेकिन मुझे लाइनों को जल्दी से गिनने के लिए कोई "साफ" तरीका नहीं मिला। –

+0

ठीक काम करता है। लेकिन फाइल में 99 लाइनें हैं लेकिन यह 98 लौटाती है। क्या आपको पता है क्यों? – Bala

12

मैं seek function के प्रयोग पर Николай Конев से सहमत लाइन द्वारा पूरी फ़ाइल लाइन से गुजर रही की तुलना में बहुत तेजी से होता है, लेकिन जैसा कि Twisted1919 अंतिम पंक्ति तलाश करने के लिए फ़ाइल आकार का उपयोग करते हुए कहा तो भ्रामक मेरे सुझाव फ़ाइल आकार के बजाय PHP_INT_MAX का उपयोग करें :

// force to seek to last line, won't raise error 
$file->seek(PHP_INT_MAX); 
$linesTotal = $file->key();