0

ここにphp初心者がいます..区切られたテキストファイルからデータをインポートし、それらをhtmlテーブルにマップする方法に関するPHPヘルプのアイデア/例が必要です。データが入力され、適切なヘッダーの下にマップされます。各レコードにすべての値が含まれていない場合もあり、データがない場合は null のままにすることができます (サンプル レコードを参照)。また、レコードごとにテーブルの行エントリを作成します。

たとえば、入力/ソース ファイルには次のエントリがあります。たとえば、テーブル ヘッダー "Server" レコードにすべての値 (1 ~ 7) が含まれていない場合もあります (以下を参照)。

1-MyServer=server4.mra.dev.pp1;2-MyLogdate=Wed Aug 11 2010;3-MyDataset=dbip.pp1;4-MyStartTime=01:00:03;5-MyDuration=00:36:09;6-MySize=41.54 GB;7-MyStatus=Succeeded;
1-MyServer=server9.mra.dev.kul;2-MyLogdate=Wed Aug 11 2010;3-MyDataset=gls202.kul_lvm;5-MyDuration=06:20:33;7-MyStatus=Succeeded;
1-MyServer=server9.mra.dev.kul;2-MyLogdate=Wed Aug 11 2010;3-MyDataset=gls101.aie_lvm;4-MyStartTime=01:00:02;

これもマップするために必要なhtmlテーブルのコピーです:(また、「2-MyLogdate」のレコードをヘッダーに入力する必要はありません)

<table id="stats">
tr>
  <th>Server</th>
  <th>Set</th>
  <th>Start</th>
  <th>Duration</th>
  <th>Size</th>
  <th>Status</th>
</tr>
<tr>
<td>server4.mel.dev.sp1</td>
<td>dbip.sp1</td>
<td>01:00:03</td>
<td>00:36:09</td>
<td>41.54 GB</td>
<td>Succeeded</td>
</tr>
</table>

したがって、私が本当に必要としているのは、これらを適切にマッピングするシステムです。これをphpで書くにはどうすればいいですか?? ありがとう!

4

2 に答える 2

1

ファイル内のパターンを見つけることがすべてです。あなたの例では、かなり簡単です:

[number]-[column name]=[value];

私が見る主な問題は、冗長な情報があることです。列の番号と列自体が行ごとに繰り返されます。ただし、それらを解析することはできます。プログラムに何を期待するかによって異なります。列の順序は常に同じですか? 常に同じ列がありますか? 不明な列にどのように対応する必要がありますか?

正規表現を使用してできることの簡単な例を次に示します。この例では、列名がすべて同じであり、それらをすべて表示する必要があり、それらが常に同じ順序になることを前提としています。つまり、簡単にやっています。

$data = array();

$lines = file("my/log/file.log");
// this will parse every line into an associative array, discarding the header number
foreach ($lines as $line)
{
    // populate $matches with arrays where indices are as follows:
    // 0: the whole string (0-Foo=bar;)
    // 1: the column number (0)
    // 2: the column name (Foo)
    // 3: the value (Bar)
    preg_match_all("/([0-9])-([^=]+)=([^;]+);/", $line, $matches, PREG_SET_ORDER);
    $lineData = array();
    foreach ($matches as $information)
        $lineData[$information[2]] = $information[3];
    $data[] = $lineData;
}

$keys = array_keys($data[0]); // you can also set this yourself
// for instance, $keys = array('MyServer', 'MyDataset'); would only display those two columns
echo '<table><tr>';
foreach ($keys as $column)
    echo '<th>' . $column . '</th>';
echo '</tr>';

foreach ($data as $row)
{
    echo '<tr>';
    foreach ($keys as $column)
        echo '<td>' . (isset($row[$column]) ? $row[$column] : '') . '</td>';
    echo '</tr>';
}
echo '</table>';
于 2010-08-12T06:30:33.303 に答える
0

このようなもの

$logarr = file("log.txt");
foreach ($logarr as $s) {
  $s = str_replace(";","&",$s);
  $a = array();
  parse_str($s,$a);
  echo "<tr>\n";
  if (isset($a['1-MyServer'])) echo $a['1-MyServer']; else echo "&nbsp;"
  if (isset($a['2-MyLogdate'])) echo $a['2-MyLogdate']; else echo "&nbsp;"
  // and so on
  echo "</tr>\n";
}
于 2010-08-12T06:24:32.037 に答える