0

タイトルは混乱を招く可能性があるため、この問題についてできるだけ説明するようにします。解析されるテキスト ファイルは次のとおりです。

server1 2013-08-27 08:42:01

username1   902     1  0 Aug26 ?        00:01:51 Text here

username1  2044     1  0 Jul14 ?        04:54:52 Text here

server2 2013-08-27 08:42:03

username2  2184     1  1 Jul17 ?        10:21:11 Text here

server3 2013-08-27 08:42:05

username3  2225     1  0 Jul17 ?        05:04:25 Text here

server2 2013-08-27 08:42:07

username2 13233     1  0 Jul15 ?        00:15:09 Text here

username2 13233     1  0 Jul15 ?        00:15:09 Text here

server3 2013-08-27 08:42:09

username3  6131     1  0 Jul15 ?        00:22:19 Text here

ご覧のとおり、サーバーは特定の順序ではありません。私が達成したいのは、サーバーとそれぞれのテキストのビットを配列に入れることです。プログラムはファイルを解析し、「server1」を見つけるたびに、その行とその下のすべてを「server1」という配列に入れます。別の名前のサーバーを見つけると、すべてのテキスト行を別の配列に追加します。「server2」または「server3」。

出力は次のようになります。

//serverX (X は 1 ~ 99)

array(n){
    [0]=> string(n) "serverX ..."
    [1]=> string(n) "usernameX ..."
    [2]=> string(n) "usernameX ..."
    [3]=> string(n) "usernameX ..."
    [4]=> string(n) "serverX ..."
    [5]=> string(n) "usernameX ..."
}

これは、すべてのサーバー (server1..n) に、文字列が追加される 1 つの配列があることを意味します。

4

1 に答える 1

1

これには正規表現を使用することをお勧めします。サンプルは次のとおりです。

//here $sData is incoming plain text data
$rgResult = [];
preg_match_all('/server([^\s]+)\s+([^\r\n]+)(((?!server).)*)/msi', $sData, $rgServers, PREG_SET_ORDER);
foreach($rgServers as $rgMatches)
{
   $rgResult[$rgMatches[1]][] = [
      'date' => $rgMatches[2],
      'list' => array_map(function($sItem)
      {
         return preg_split('/\s+/', $sItem, -1, PREG_SPLIT_NO_EMPTY);
      }, preg_split('/[\r\n]+/', $rgMatches[3], -1, PREG_SPLIT_NO_EMPTY))
   ];
}
//var_dump($rgResult);

私はあなたの編集を好みの形式で見ましたが、それは不明です (どういうわけかあなたのサーバーはあなたのサンプルで別のものになっているからです)。上記の例では、サーバーを配列に分割し、各日付エントリもユーザーのリストとは別に配置します (ユーザー名も最初に来ると仮定します)。

于 2013-08-27T07:27:49.477 に答える