Мне нужно проанализировать простой текстовый файл в 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 '.
Но вывод содержит только одно « Мороженое ».
Как я могу заставить их быть проанализированными?
Пожалуйста, помогите ...