18.7. Counting Lines, Paragraphs, or Records in a File18.7.2. SolutionTo count lines, use fgets( ). Because it reads a line at a time, you can count the number of times it's called before reaching the end of a file:
To count paragraphs, increment the counter only when you read a blank line:
To count records, increment the counter only when the line read contains just the record separator and whitespace:
18.7.3. DiscussionIn the line counter, $lines is incremented only if fgets( ) returns a true value. As fgets( ) moves through the file, it returns each line it retrieves. When it reaches the last line, it returns false, so $lines doesn't get incorrectly incremented. Because EOF has been reached on the file, feof( ) returns true, and the while loop ends. This paragraph counter works fine on simple text but may produce unexpected results when presented with a long string of blank lines or a file without two consecutive linebreaks. These problems can be remedied with functions based on preg_split( ). If the file is small and can be read into memory, use the pc_split_paragraphs( ) function shown in Example 18-1. This function returns an array containing each paragraph in the file. Example 18-1. pc_split_paragraphs( )
The contents of the file are broken on two or more consecutive newlines and returned in the $matches array. The default record-separation regular expression, \r?\n, matches both Windows and Unix linebreaks. If the file is too big to read into memory at once, use the pc_split_paragraphs_largefile( ) function shown in Example 18-2, which reads the file in 4K chunks. Example 18-2. pc_split_paragraphs_largefile( )
This function uses the same regular expression as pc_split_paragraphs( ) to split the file into paragraphs. When it finds a paragraph end in a chunk read from the file, it saves the rest of the text in the chunk in $unmatched_text and prepends it to the next chunk read. This includes the unmatched text as the beginning of the next paragraph in the file. 18.7.4. See AlsoDocumentation on fgets( ) at http://www.php.net/fgets, on feof( ) at http://www.php.net/feof, and on preg_split( ) at http://www.php.net/preg-split.
Copyright © 2003 O'Reilly & Associates. All rights reserved. |
|