Как читать файл построчно и пропускать некоторые промежуточные символы новой строки в PHP - PullRequest
0 голосов
/ 25 марта 2020

это мой первый вопрос здесь. У меня есть файл (это данные epf, экспортированные из itunes), как в этом примере Набор данных EPF

столбцы разделены SOH (символ ASCII 1), а строки - STX (символ ASCII 2) + «Н». Все хорошо, но описания приложений многострочные и содержат символы конца строки. Таким образом, проблема заключается в том, что когда я пытался прочитать файл построчно

  $fn = fopen("application_stripped","r");

  while(! feof($fn))  {
    $result = fgets($fn);
    print_r($result);
  }

  fclose($fn);

, он обнаруживает первый конец строки (то есть в описании), но не фактический символ конца строки, который находится в конце ряда. Входные файлы очень большие (до 4-5 ГБ). Есть идеи, как с этим справиться?

PS: простите за мой Engli sh! : -)

1 Ответ

0 голосов
/ 26 марта 2020

спасибо всем за вашу помощь, похоже, я смог решить эту проблему. Вот код, который я сделал

$columnBreakpoint = 17;
$handle = @fopen("inputfile.txt", "r");
if ($handle) {

  #export_date
  #application_id
  #title
  #recommended_age
  #artist_name
  #seller_name
  #company_url
  #support_url
  #view_url
  #artwork_url_large
  #artwork_url_small
  #itunes_release_date
  #copyright
  #description
  #version
  #itunes_version
  #download_size

  $fileSeekPointer = 0;
  while(! feof($handle))  {
    // Reading a part of string
    $result = stream_get_line($handle, 10000);

    $positions = array();
    $pos = -1;
    // Detecting all the positions of the column separator symbol
    while (($pos = strpos($result, "\x01", $pos + 1)) !== false) {
      $positions[] = $pos;
    }
    // Getting 17th column separator position, because each product line must contain at least 17 columns
    $breakpointPos = $positions[$columnBreakpoint];
    // Stripping the line by this position
    $resultS = substr($result, 0, $breakpointPos);
    // Detecting position of end-of-line symbol in substring and strip by it
    $eolPos = strrpos($resultS, PHP_EOL);
    $resultS = substr($resultS, 0, $eolPos);
    // Now we must find the first position after actual EOL symbol
    $fileSeekPointer += ($breakpointPos + ($eolPos - $breakpointPos)) + 1;
    // And set file pointer on the first position after actual end of line
    fseek($handle, $fileSeekPointer);

    print '------------------'."\n";
    var_dump($resultS);
  }

  fclose($handle);
}
...