Избегайте исключения похожих строк при разборе определенного файла TXT в CSV - PullRequest
0 голосов
/ 19 июня 2019

Мне нужно проанализировать простой текстовый файл в CSV-файл (также в простом текстовом формате). Итак, у меня есть скрипт php, работающий на сервере с версией PHP 5.3.13. И нет возможности обновить. Работает нормально вроде ...

Во-первых. Вот скрипт php: ( это полный рабочий скрипт )

<?php
// INPUT RAW FILE -- UTF8 !!!!
$data = trim(file_get_contents('inbox_file_utf8_clean.txt'));

$all_lines = preg_split("/\r?\n/", $data);
$date_id_line = array_shift($all_lines);
if(!preg_match('/^\d+\s\w+\s(?<time>\d+:\d+)\sId:\s(?<id>\d+).*/', $date_id_line, $matches)) {
  trigger_error('Failed to match ID and timestamp', E_USER_ERROR);
}
$output_data = array(
  'info' => array(
    'id' => $matches['id'],
    'time' => $matches['time']
  ),
  'data' => array()
);

$all_text_headers = array_values(preg_grep('/^\s*\(/', $all_lines));

// The first "Text header" is a parent.
// Count the number of leading whitespaces to determine other parents
preg_match('/^\x20*/', $all_text_headers[0], $leading_space_matches);
$leading_spaces = $leading_space_matches[0];
$num_leading_spaces = strlen($leading_spaces);
$parent_lead = str_repeat(' ', $num_leading_spaces) . '(';
$parent = NULL;
foreach($all_text_headers as $index => $header_line) {
  list($lead, $item_value) = explode(') ', $header_line);
  list($topic, $topic_count) = array_map('trim',
    preg_split('/\s{2,}/', $item_value, -1, PREG_SPLIT_NO_EMPTY)
  );

  $topic_count = preg_replace('/\D/', '', $topic_count);

  if($is_parent = ($parent === NULL || strpos($lead, $parent_lead) === 0)) {
    $parent = $topic;
  }

  if($is_parent) {
    $output_data['data'][$parent] = array(
      'count' => $topic_count,
      'values' => array(),
    );
  } else {
    $output_data['data'][$parent]['values'][] = array(
      'topic' => $topic,
      'count' => $topic_count
    );
  }
}

$csv_delimiter = ';';
//output file -- result file -- CSV -- 
$handle = fopen('csv.txt', 'wb');

fputcsv($handle, array_values($output_data['info']), $csv_delimiter);

foreach($output_data['data'] as $parent_topic => $data) {
  $child_data = array();
  if($data['values']) {
    foreach($data['values'] as $arr) {
      $child_data[] = sprintf('%s x%d', $arr['topic'], $arr['count']);
    }
  }
  fputcsv($handle, array(
    $parent_topic,
    $data['count'],
    implode(', ', $child_data)
  ), $csv_delimiter);
}

fclose($handle);

echo "it's kinda done :-)";

$order_num = $matches['id'];

sleep(4);
?>

Файл, который мне нужно проанализировать, выглядит следующим образом: ( этот пример - настоящий обычный текстовый файл, который мне нужно проанализировать. Это просто простой текстовый файл в кодировке utf8. Это настоящий текстовый файл 'input' . )

18 jun 15:28 Id: 42 #1 Random Text                                     
(Text header 1) Apple                    15
   (Text header 1) Really long line           
   here is the rest of the             
   long line that does'n get parsed
(Text header 1) Milk          2
(Text header 1) Ice cream                   4
(Text header 1) Ice cream                   4
(Text header 1) Pencil            1
(Text header 1) Box                    1
   (Text header 1) Cardboard                 x1
   (Text header 1) White                 x1
   (Text header 1) Cube              x1
(Text header 1) Phone     1
   (Text header 1) Specific text                x1
   (Text header 1) Symbian                x1

Дескриптор формата: просто текстовый файл. Первая строка - заголовок. Все остальные строки (кроме строк, начинающихся с пробелов) являются индексными. Все строки, начинающиеся с начальных пробелов, являются «дочерними» строками .

И я получаю CSV-файл выходных результатов: ( этот пример является реальным выводом простого текста. )

42;15:28
Apple;15;Really long line;
Milk;2;
"Ice cream";4;
Pencil;1;
Box;1;"Cardboard x1, White x1, Cube x1";
Phone;1;"Specific text x1, Symbian x1";

У меня есть одна проблема .

Если входной файл содержит две одинаковые строки , выходной CSV-файл содержит только одну из этих двух строк. Мне нужны они оба.

Итак, во входном файле примера у меня есть два ' Ice cream '. Но вывод содержит только одно « Мороженое ». Как я могу заставить их быть проанализированными?

Пожалуйста, помогите ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...