Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [PCRE] log-файл в массив 
V
    Опции темы
Gold Dragon
  Дата 17.1.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Помогите log-файл загнать в массив. Вот пример

Код

2007-01-17 09:44:20   3 11 1  GET forum.joom.ru 213.135.140.35:1127 213.85.145.245:80 1130 12371
2007-01-17 09:44:20   3 11 1  GET counter.yadro.ru 213.135.140.35:1131 88.212.196.77:80 1238 884
2007-01-17 09:44:20   3 11 1  GET forum.joom.ru 213.135.140.35:1128 213.85.145.245:80 1128 623
2007-01-17 09:44:52   3 11 3  GET vingrad.ru 213.135.140.35:1134 62.75.204.171:80 980 1384


Данные разделяются пробелами. Количество пробелов между данными не постоянно.

формат массива такой:

Код

$log = Array (
    'data',
    'time',
    'idF',
    'tHTTP',
    'sHTTP',
    'mHTTP',
    'name',
    'kIP',
    'sIP',
    'out',
    'in');

    
И уж заодно, как лучше загружать log-файл, т.к. размер его может быть довольно большим


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
SamDark
Дата 17.1.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 4
Всего: 38



Gold Dragon, 
т.к. число пробелов не постояноо: используй preg_split(' +', $log_line).

Вывод лучше организовать постраничный. При этом не читать весь файл. Пользоваться fseek().



--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Mal Hack
Дата 17.1.2007, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Проще сначала грохнуть все двойные пробелы, затем explode.
PM ICQ   Вверх
SamDark
Дата 17.1.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 4
Всего: 38



Mal Hack, 
Двойные пробелы всё-равно грохать регуляркой (может их и не два). Зачем делать лишние действия?


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Mal Hack
Дата 18.1.2007, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



А потому, что регурялка скорее всего в данном случае больше скушает.
PM ICQ   Вверх
SamDark
Дата 18.1.2007, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 4
Всего: 38



Mal Hack, 
Надо проверить.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Gold Dragon
Дата 18.1.2007, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Так. а как мне грухнуть двоуные, тройные и тому подобные пробулы?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
mishaSL
Дата 18.1.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 9
Всего: 54



Проще как говорил 
SamDark, к примеру preg_split("/[\s]+/", $line); потом протестируй на больших файлах.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
Gold Dragon
Дата 18.1.2007, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Цитата(SamDark @  17.1.2007,  12:08 Найти цитируемый пост)
Вывод лучше организовать постраничный. При этом не читать весь файл. Пользоваться fseek().
 не понял, а как сделать постранично из файла.. Разве  fseek() работает не с бинарным файлом? Там вроде смещение в байтах..



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
SamDark
Дата 18.1.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 4
Всего: 38



Gold Dragon, 
Всё правильно. Читать придётся побайтно порциями.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Mal Hack
Дата 18.1.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



На счет начального "гроханья" двойных пробелов я поспешил... Виноват...
Код

<?php

    $str =<<<OEF
2007-01-17 09:44:20   3 11 1             GET forum.joom.ru 213.135.140.35:1127 213.85.145.245:80 1130 12371
2007-01-17 09:44:20   3 11 1  GET counter.yadro.ru 213.135.140.35:1131 88.212.196.77:80 1238 884
2007-01-17 09:44:20   3 11 1  GET forum.joom.ru 213.135.140.35:1128 213.85.145.245:80 1128 623
2007-01-17 09:44:52   3 11 3  GET vingrad.ru 213.135.140.35:1134 62.75.204.171:80 980 1384
OEF;

    $str = preg_replace("#\s{2,}#", " ", $str);   
    
    $ar2 = preg_split("#\s|$#", $str);
    
    print_r($ar2);

?>

На выходе получаем единый вектор. Работать проще, чем с матрицей. Надо просто смещение указывать.
А смысл использовать fseek? - Никакого. Файл в любом случае будет полностью записан в ОП. Так что на больших файлам вообще потоке придется использовать.
PM ICQ   Вверх
SamDark
Дата 18.1.2007, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 4
Всего: 38



Mal Hack, 
Может сразу preg_split("#\s+#", $str)?
Код

<?php

    $str =<<<OEF
2007-01-17 09:44:20   3 11 1             GET forum.joom.ru 213.135.140.35:1127 213.85.145.245:80 1130 12371
2007-01-17 09:44:20   3 11 1  GET counter.yadro.ru 213.135.140.35:1131 88.212.196.77:80 1238 884
2007-01-17 09:44:20   3 11 1  GET forum.joom.ru 213.135.140.35:1128 213.85.145.245:80 1128 623
2007-01-17 09:44:52   3 11 3  GET vingrad.ru 213.135.140.35:1134 62.75.204.171:80 980 1384
OEF;  
    
    $ar2 = preg_split("#\s+#", $str);    
    print nl2br(print_r($ar2, true));

?>



--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Mal Hack
Дата 18.1.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 16
Всего: 261



Цитата(SamDark @  18.1.2007,  16:28 Найти цитируемый пост)
Может сразу preg_split("#\s+#", $str)?

Наверное, это уже замашки сишника с паскальщиком smile Там сначала удаляешь, потом режешьsmile
Только не забудь, что нам еще резать надо по концу строки.


Цитата(SamDark @  18.1.2007,  16:28 Найти цитируемый пост)
print nl2br(print_r($ar2, true));

Жжошьsmile
PM ICQ   Вверх
Gold Dragon
Дата 18.1.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 1
Всего: 71



Цитата(SamDark @  18.1.2007,  16:18 Найти цитируемый пост)
Всё правильно. Читать придётся побайтно порциями.

да но в каждой строе разное количество байт

Добавлено @ 16:51 
Цитата(Mal Hack @  18.1.2007,  16:23 Найти цитируемый пост)
На выходе получаем единый вектор. Работать проще, чем с матрицей. Надо просто смещение указывать.

По моему с матрицей лучше smile Но у тебя всё отлично работает..

SamDark, что-то не хочет запускаться...


ps
а такой глупый вопрос: пробел и табуляция - это ведь разные вещи? 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
SamDark
Дата 19.1.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 4
Всего: 38



Mal Hack, 
Цитата
Только не забудь, что нам еще резать надо по концу строки.

Ну, это же вариант с вектором... так что не надо.

Цитата
Жжошь

Люблю, когда наглядно  smile 

Gold Dragon, 
Цитата
да но в каждой строе разное количество байт

Открываешь файл. Смещаешь курсор на некоторое значение. Читаешь не менее N символов до следующего перевода строки.

Цитата
а такой глупый вопрос: пробел и табуляция - это ведь разные вещи? 

Разные, поэтому в регулярном выражении используется класс \s, который включает и пробелы и табуляции и, если не ошибаюсь, переводы строк.

Вот рабочий код для вектора:
Код

<?php

    $str =<<<OEF
2007-01-17 09:44:20   3 11 1             GET forum.joom.ru 213.135.140.35:1127 213.85.145.245:80 1130 12371
2007-01-17 09:44:20   3 11 1  GET counter.yadro.ru 213.135.140.35:1131 88.212.196.77:80 1238 884
2007-01-17 09:44:20   3 11 1  GET forum.joom.ru 213.135.140.35:1128 213.85.145.245:80 1128 623
2007-01-17 09:44:52   3 11 3  GET vingrad.ru 213.135.140.35:1134 62.75.204.171:80 980 1384
OEF;

    $ar2 = preg_split("~\s+~", $str);    
    print nl2br(print_r($ar2, true));

?>



--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0673 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.