2011-12-01 37 views

Trả lời

4

Tại sao không chỉ sử dụng trình xử lý tệp và thực hiện như trong this question? Đơn giản, nhanh chóng và rất hiệu quả.

Nếu bắt buộc phải sử dụng SPL, bạn có thể làm điều đó như thế này

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

Tôi đã sử dụng fopen/fgets cách đọc tệp truyền thống như bạn đã đề xuất, cảm ơn. Đôi khi tôi chỉ cố gắng làm tất cả mọi thứ với các lớp học khi nó không cần thiết. –

+0

Nếu bạn muốn thực hiện việc ghi tập tin theo cách hướng đối tượng, đó chính xác là lý do tại sao SPL tồn tại. –

+4

Ngoài ra còn có ['iterator_count()'] (http://php.net/iterator_count). – salathe

3

Các SplFileObject cung cấp một itertor, một lần lặp trên mỗi dòng:

$numberOfLines = iterator_count($file); 

Chức năng iterator_count là bạn của bạn ở đây, thực hiện traversal cho bạn và trả về số lần lặp lại.

Bạn có thể sử dụng đối tượng tệp SKIP_EMPTY flag để không tính các dòng trống trong tệp đó.

+0

Câu trả lời tuyệt vời nhưng trên tệp lớn hơn (10mb và 135.000 dòng trở lên trong trường hợp này) nó hoàn toàn quá chậm và một nỗ lực để đếm bằng cách sử dụng phương pháp này thực sự dẫn đến một thời gian. – Typo

33

iterator_count và lặp dòng-by-line bằng cách sử dụng next() bị hỏng trong phiên bản php 5.3.7 của tôi trong Ubuntu.

Cũng có vẻ như bị hỏng fseek([any offset], SEEK_END). key() trả về 0.

Lặp lại các tệp lớn bằng cách sử dụng seek($lineCount) quá chậm.

đơn giản nhất cách 5.3.7-kiểm tra là đáng

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

Đếm 30000 dòng đòi hỏi hiện nay 0,00002 giây và chi phí khoảng 20 kb bộ nhớ.

Phương pháp lặp mất khoảng 3 giây.

+0

điều này là sai, tìm kiếm() sẽ tìm số dòng trong khi getSize() sẽ trả về kích thước tệp theo byte. – Twisted1919

+1

Tôi biết. Nó chỉ đảm bảo rằng chúng tôi đã tìm kiếm các dòng tập tin __all__ (ngay cả khi tất cả chúng đều trống). Tại hầu hết các trường hợp phổ biến, tìm kiếm() sẽ va vào EOF trên số dòng chắc chắn ít hơn số byte, nhưng PHP xử lý âm thầm, trả lại số dòng cuối cùng. Đồng ý, đó là hack bẩn, nhưng tôi đã không tìm thấy bất kỳ "sạch" cách để đếm dòng một cách nhanh chóng. –

+0

hoạt động tốt. Nhưng tập tin có 99 dòng nhưng nó trả về 98. bạn có biết tại sao không? – Bala

12

Tôi đồng ý với Николай Конев về việc sử dụng seek function là nhanh hơn nhiều so với đi qua toàn bộ dòng tập tin bằng cách dòng, nhưng như Twisted1919 nói sử dụng kích thước tập tin để tìm dòng cuối cùng là khó hiểu vì vậy tôi khuyên sử dụng PHP_INT_MAX thay vì kích thước tập tin :

// force to seek to last line, won't raise error 
$file->seek(PHP_INT_MAX); 
$linesTotal = $file->key(); 
Các vấn đề liên quan