2013-04-30 6 views
0

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

ADVMONITOR "WINOSSPI-RPCService-Win2k" 
DESCRIPTION "Checks the 'Remote Procedure Call (RPC)' Windows 2000 service and its corresponding process" 
INTERVAL "5m2s" 
SCRIPTTYPE "VBScript" 
MULTISOURCE 
INSTANCEMODE ONCE 
MAXTHRESHOLD 
SEPARATORS " " 
ICASE 
PROGRAM "Process" 
    DESCRIPTION "Returns the number of running 'svchost.exe' processes;" 
    MONPROG "opcntprocs.exe WINOSSPI-RPCService-Win2k-Process svchost" 
PROGRAM "Service" 
    DESCRIPTION "Returns values that correspond to different states of the service 'RPC Service'" 
    MONPROG "opcntservice_chk.bat RpcSs WINOSSPI-RPCService-Win2k-Service" 
MSGCONDITIONS 
    INSTANCERULE "Combined Service and Process Monitor; suppress messages caused by same case;" 
    ID "d5ca6823-37d4-4581-886a-2aad3462d9e0" 
    DESCRIPTION "Checks the services and processes" 
    CONDITION_ID "0cdb88dd-0338-47d3-a5f5-e4d982e8a1a9" 
    CONDITION 

И что мне нужно, чтобы получить информацию от каждого отдельного блока на пути что я могу импортировать такую ​​информацию в db, но я не могу получить хорошую итерацию через разные блоки, чтобы получить нужные данные из каждого блока с помощью красивой и идентифицируемой манеры.

Я попытался идентифицировать блоки в соответствии с вкладками, используя класс с именем tabbedLinesTree, который преобразует весь текст с вкладками в XML, что тоже полезно, но разные поля не отображаются с именем полей или каким-либо другим способом идентифицировать какой блок мы проходим.

Резюмируя ... Я хотел бы, чтобы пройти через этот файл и получить (в качестве примера) для каждого блока PROGRAM массив с именем PROGRAM, то DESCRIPTIONMONPROG и для этого блока ...

Не знаете, как концептуализировать это, можете ли вы, пожалуйста, помочь мне в этом с какой-либо идеей?

Я хорошо разбираюсь в PHP, но при необходимости может реализовать любое другое решение.

Пс: в некоторых блоках может быть больше вкладок или больше полей (строк) информации.

--- НИЖЕ ТЕКСТ ДОБАВЛЕНО ПОСЛЕ ОТВЕТА Найджела ---

Второй пример текста ...

SYNTAX_VERSION 5 

LOGFILE "OvSvcDiscErrorLog" 
DESCRIPTION "Self-Management OvService Discovery agent error log" 
LOGPATH "<OvSvcDiscErrorLog>" 
INTERVAL "5m" 
CHSET ASCII 
FROM_LAST_POS 
NO_LOGFILE_MSG 
CLOSE_AFTER_READ 
SEPARATORS " " 
MSGCONDITIONS 
       DESCRIPTION "[E01-001] EXCEPTION while installing policy" 
       SUPP_DUPL_IDENT "3m" 
        COUNTER_THRESHOLD 0 
       CONDITION_ID "17adc1d1-32cf-42ca-be5f-1cf784f19026" 
       CONDITION 
        TEXT "<*> \\[E01-001\\] EXCEPTION while installing policy <*.polname>" SEPARATORS "  " 
       SET 
        SEVERITY Critical 
        APPLICATION "OVO/Win" 
        MSGGRP "OVO" 
        OBJECT "OvSvcDiscAgent" 
        TEXT "[E01-001]EXCEPTION while installing policy "` 
+0

Вы можете указать вкладки в формате входного файла? – herrjeh42

+0

Привет, Эмилиано, этот второй пример выглядит как дерево-подобная структура. Например. 'SET' является дочерним элементом' MSGCONDITIONS', а 'SVERITY' и' APPLICATION' являются дочерними элементами 'SET'. Правильно ли это? –

+0

эй, ребята! извините, не видел ваших последних комментариев ... Джейми, спасибо за ваш ответ, что вы имеете в виду с указанием?хотите, чтобы я выделил вкладки? Я могу это сделать. Найджел, именно это! :) – Emiliano

ответ

0

Привет это не красиво, но это работает. Конечный результат, полученный в приведенном ниже коде, выглядит следующим образом:

Array 
(
    [PROGRAM_Process] => Array 
     (
      [name] => Process 
      [DESCRIPTION] => Returns the number of running 'svchost.exe' processes; 
      [MONPROG] => opcntprocs.exe WINOSSPI-RPCService-Win2k-Process svchost 
     ) 

    [PROGRAM_Service] => Array 
     (
      [name] => Service 
      [DESCRIPTION] => Returns values that correspond to different states of the service 'RPC Service' 
      [MONPROG] => opcntservice_chk.bat RpcSs WINOSSPI-RPCService-Win2k-Service 
     ) 

) 

В его сердце находится функция PHP parse_ini_file(). parse_ini_file() принимает в качестве входного текста текстовый файл в обычном формате .ini, например;

[first_section] 
one = 1 
five = 5 
animal = BIRD 

[second_section] 
path = "/usr/local/bin" 
URL = "http://www.example.com/~username" 

и возвращает ассоциативный массив. Большая часть приведенного ниже кода касается реформирования вашего входного файла, чтобы сделать его подходящим для parse_ini_file(). Реформирование осуществляется циклом foreach. Реформированные данные собираются в массиве $arr_ini.

К сожалению, parse_ini_file() будет принимать только файл (не строку), поэтому мне пришлось использовать временный файл с именем tmp.ini.

<?php 

$tmp_file = 'tmp.ini'; 
$input_file = 'input.txt'; 
$arr_input = explode("\r\n", file_get_contents($input_file)); 
$arr_ini = array(); 
$flg_collate = false; 

foreach($arr_input as $line) { 

    $split = explode(' ', trim($line), 2); 

    if ($flg_collate) { 
    if (substr($line, 0, 1) == ' ') { 
     $arr_ini[] = $split[0].'='.$split[1]; 
    } else { 
     $flg_collate = false; 
    } 
    } 

    if ($split[0] == 'PROGRAM') { 
    $without_quotes = trim($split[1], '"'); 
    $arr_ini[] = "[PROGRAM_$without_quotes]"; 
    $arr_ini[] = "name = {$split[1]}"; 
    $flg_collate = true; 
    } 
} 

file_put_contents($tmp_file, implode("\r\n", $arr_ini)); 
$arr_result = parse_ini_file($tmp_file, true); 

echo "<h1>Reformed array</h1><xmp>".print_r($arr_ini, true)."</xmp>"; 
echo "<h1>Result as an Array</h1><xmp>".print_r($arr_result, true)."</xmp>"; 

?> 

Результат $arr_result. Первый echo выводит один из промежуточных этапов. Второй результат echo выводит результат.

Надеюсь, что это поможет.

+0

Привет @Nigel! Спасибо за ваш ответ. Я нашел здесь две вещи, которые заставляют меня поверить, что это не сработает. Сначала не все блоки, которые мне нужно идентифицировать, начинаются с «ПРОГРАММА», а во вторых некоторые блоки могут иметь разные вкладки в начале строки (иногда один или два, другие три, четыре, пять или более) См. новый пример того, как изменяется исходный код. – Emiliano

+0

Вы добавили второй пример на свой вопрос на следующий день после того, как разместили свой исходный вопрос. Когда вы задаете вопрос, а затем изменяете его позже, общая практика заключается в том, чтобы дать понять, что вы изменили вопрос, обычно добавляя слово ** Edit ** или подобное. Таким образом, нет никаких шансов заставить людей, которые отвечают на ваш оригинальный вопрос, выглядит глупо. –

+0

Извините @ Нигел, на самом деле я не думал, что ты чувствуешь себя глупо. Я не думаю, что ты выглядишь так, как только ты предоставил мне первый ответ, показывающий мне, что ты готов помочь, и это был хороший ответ, но не сделал Я покрыл все, что мне нужно. Извините, если я не был достаточно ясным, поэтому мне нужно было добавить новый код, который я добавил к вопросу, чтобы показать, как могут быть возможные варианты, но, пожалуйста, пройдите через мой оригинальный пост и посмотрите на PS, он ясно говорит, что «некоторые блоки может иметь больше вкладок ». – Emiliano