Skip to content

FileReader

Ray Fung edited this page Feb 26, 2026 · 3 revisions

FileReader

The FileReader class provides a memory-efficient, line-by-line file reader powered by PHP generators. It supports concatenating multiple files into a single sequential stream.

Methods

Method Return Description
__construct(string $filePath) ?? Open the first file for reading
append(string $filePath) FileReader Append another file to the read queue
prepend(string $filePath) FileReader Prepend another file before the current queue
fetch() ?string Return the next line, or null when exhausted

Basic Usage

use Razy\FileReader;

$reader = new FileReader('/path/to/data.txt');

// Read line by line
while (($line = $reader->fetch()) !== null) {
    echo $line . "\n";
}

Multi-File Concatenation

Chain multiple files together ??they are read sequentially as a single stream:

$reader = new FileReader('/logs/app-2026-01.log');
$reader->append('/logs/app-2026-02.log')
       ->append('/logs/app-2026-03.log');

// Reads all three files in order
while (($line = $reader->fetch()) !== null) {
    // Process each line from all files
}

Prepending Files

$reader = new FileReader('/data/main.csv');

// Add a header file before the main data
$reader->prepend('/data/header.csv');

// Reads header.csv first, then main.csv
while (($line = $reader->fetch()) !== null) {
    $fields = str_getcsv($line);
    // Process CSV row
}

Example: Reading CSV Files

use Razy\FileReader;

$reader = new FileReader('/data/users.csv');
$headers = null;
$users   = [];

while (($line = $reader->fetch()) !== null) {
    $row = str_getcsv($line);
    if ($headers === null) {
        $headers = $row;
        continue;
    }
    $users[] = array_combine($headers, $row);
}

Example: Processing Large Log Files

use Razy\FileReader;

$reader = new FileReader('/var/log/app/error.log');
$errors = [];

while (($line = $reader->fetch()) !== null) {
    if (str_contains($line, '[ERROR]')) {
        $errors[] = $line;
    }
}

echo 'Found ' . count($errors) . ' errors';

Example: Merging Multiple Data Files

use Razy\FileReader;

// Merge daily report files into a single stream
$reader = new FileReader('/reports/day1.csv');
$reader->append('/reports/day2.csv')
       ->append('/reports/day3.csv');

$totalRows = 0;
while ($reader->fetch() !== null) {
    $totalRows++;
}

echo "Processed $totalRows lines across 3 files";

??PreviousSimplifiedMessage Next ?’Crypt

Clone this wiki locally