Как разбить большой файл со строками на маленькие?

Преобразование большого файла со строками на маленькие можно выполнить с помощью PHP. Существует несколько подходов для решения этой задачи, и мы рассмотрим несколько из них.

1. Использование функции file():

$file = 'path/to/large_file.txt';
$lines = file($file, FILE_IGNORE_NEW_LINES);

$count = 0;
$batch_size = 1000; // Количество строк в каждой маленькой партии

while ($count < count($lines)) {
    $batch = array_slice($lines, $count, $batch_size);
    
    // Сохраняем маленькую партию строк в отдельный файл
    file_put_contents("path/to/small_files/small_file{$count}.txt", implode(PHP_EOL, $batch));
    
    $count += $batch_size;
}

Этот код использует функцию file() для чтения всех строк из большого файла, игнорируя символы новой строки. Затем используется цикл while для разбиения массива строк на маленькие партии размером $batch_size. Каждая маленькая партия сохраняется в отдельный файл с уникальным именем.

2. Использование функции fopen() и fgets():

$file = 'path/to/large_file.txt';
$batch_size = 1000; // Количество строк в каждой маленькой партии

$file_handle = fopen($file, 'r');
$count = 0;

while (!feof($file_handle)) {
    $batch = [];
    
    for ($i = 0; $i < $batch_size; $i++) {
        $line = fgets($file_handle);
        
        if ($line === false) {
            break;
        }
        
        $batch[] = $line;
    }
    
    if (!empty($batch)) {
        // Сохраняем маленькую партию строк в отдельный файл
        file_put_contents("path/to/small_files/small_file{$count}.txt", implode('', $batch));
        $count++;
    }
}

fclose($file_handle);

В этом примере мы используем функцию fopen() для открытия файла в режиме чтения и функцию fgets() для чтения строк по одной. Затем мы создаем новый файл для каждой маленькой партии строк, используя file_put_contents(). Как только мы прочитали все строки или достигли $batch_size, мы сохраняем текущую маленькую партию в файл.

3. Использование регулярных выражений:

$file = 'path/to/large_file.txt';
$batch_size = 1000; // Количество строк в каждой маленькой партии

$file_string = file_get_contents($file);
$pattern = '/(.*?n){1,' . $batch_size . '}/';

preg_match_all($pattern, $file_string, $matches);

$count = 0;
foreach ($matches[0] as $match) {
    // Сохраняем маленькую партию строк в отдельный файл
    file_put_contents("path/to/small_files/small_file{$count}.txt", $match);
    $count++;
}

В этом примере мы считываем все содержимое большого файла в строку с помощью file_get_contents(). Затем мы используем регулярное выражение для разбиения строки на маленькие партии строк. Результат сохраняется в массив $matches[0], и мы проходимся по каждому элементу этого массива, сохраняя каждый элемент в отдельный файл.

Независимо от выбранного подхода, важно помнить о возможных ограничениях на размер памяти и использование ресурсов. Если большой файл очень большой, вам может потребоваться использовать другие методы обработки данных, такие как чтение блоками или использование буферов.