Как разделить файл содержащий множество строк на несколько файлов, каждый из которых содержит определенное количество строк?

Почему при делении на маленькие файлы возникают пустые файлы?
  • 12 ноября 2023 г. 10:30
Ответы на вопрос 2
Для разделения файла на несколько файлов с определенным количеством строк можно использовать следующий подход:

1. Открыть исходный файл для чтения.
2. Создать указатель на текущую целевую файловую переменную и установить начальное значение для количества строк, которые должны быть записаны в каждый файл.
3. Прочитать строку из исходного файла.
4. Записать эту строку в текущий целевой файл.
5. Уменьшить значение количества строк, которые должны быть записаны в текущий целевой файл.
6. Если количестве строк равно 0, то закрыть текущий целевой файл и создать новый для следующей партии строк.
7. Повторять шаги 3-6, пока не будет достигнут конец исходного файла.

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

Например, если после записи последней строки в текущий целевой файл не будет вызвана проверка для создания нового файла, то текущий целевой файл останется открытым и следующая строка будет записана в текущий файл, превращая его в пустой. Этот процесс будет повторяться до конца исходного файла.

Таким образом, необходимо грамотно определить условие для создания нового файла, чтобы избежать пустых файлов в результате деления на маленькие файлы.
Вы открываете новый выходной файл внутри цикла while, но не записываете в него данные, пока не достигнете условия $cl == $make_key.$make_key = 10;
$cs = 0; //счетчик вход. файлов
$files = file("./data/phone.dat") or die ("Нету файла для крон !...");
foreach ($files as $file) {
  $cl = 0; //текущая строка
  $cf = 0; //текущий файл (выходной)
  $outdir = './data3/';
  $source = fopen($file, 'r');  
  $outhndl = fopen($outdir.'phone-'.$cs.'-'.$cf.'.dat', 'w');
  while (!feof($source)) {
    fputs($outhndl, fgets($source, 4096)); //записываем в новый файл то, что считали с входного
    $cl++;
    if ($cl == $make_key) { //как только набралось N строк
      $cl = 0;
      $cf++;
      fclose($outhndl); //закрываем текущий выходной файл
      $outhndl = fopen($outdir.'phone-'.$cs.'-'.$cf.'.dat', 'w'); //открываем новый выходной файл
    } //end if
  } //end while
  $cs++;
  fclose($source);
  fclose($outhndl); 
}
Похожие вопросы