0

次のようなタブ付きの情報を含むプレーンテキストファイルがあります

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

そして、私が必要とするのは、そのような情報をデータベースにインポートできる方法で各ブロックから情報を取得することですが、さまざまなブロックをうまく繰り返して、各ブロックから適切なデータを取得し、識別可能にすることはできません方法。

という名前のクラスを使用して、タブごとにブロックを識別しようとしましたtabbedLinesTree。これにより、すべてのタブ付きテキストが XML に変換されます。これも便利ですが、さまざまなフィールドがフィールド名またはどのブロックを識別する他の方法で表示されません。終えた。

再開しています...そのファイルを調べて、(例として)各ブロックの名前、およびそのPROGRAMブロックの の配列を取得したいと思います...PROGRAMDESCRIPTIONMONPROG

これをどのように概念化すればよいかわからないので、何かアイデアがあれば教えてください。

私は PHP が得意ですが、必要に応じて他のソリューションを実装できます。

Ps: 一部のブロックには、より多くのタブまたはより多くのフィールド (行) を含めることができます。

---ナイジェルの回答の後に追加された以下のテキスト---

2 番目のテキストの例...

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 "`
4

1 に答える 1

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出力は、中間ステップの 1 つです。2 番目echoは結果を出力します。

それが役立つことを願っています。

于 2013-05-01T00:00:56.883 に答える