【问题标题】:importing and mapping data from source file to HTML tables将数据从源文件导入和映射到 HTML 表
【发布时间】:2010-08-13 00:24:56
【问题描述】:

php 新手在这里..我需要一些关于如何从分隔文本文件导入数据并将它们映射到 html 表中的 PHP 帮助想法/示例。数据应填充并映射到其适当的标题下。在某些情况下,每条记录都没有所有值,如果没有数据,那么我们可以将其保留为空(参见示例记录)。我还会为每条记录创建一个表格行条目。

例如,输入/源文件具有以下条目:(它们以数字为前缀,表示 html 表中的标题。因此来自“1-MyServer”的数据是“server4.mra.dev.pp1”并且例如,应该在表头“服务器”下。也有记录没有所有值 (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 中编写这个?谢谢!

【问题讨论】:

    标签: php html-parsing html-table fgetcsv


    【解决方案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>';
    

    【讨论】:

    • @zneak - 感谢您的意见。是的,表格的列将保持不变。我只需要将值放入。某些列将没有该记录的数据,我们可以将其留空。
    • @jaedre619:这应该是开箱即用的。
    • @jaedre619 以为您是在询问一些想法/示例,而不是“在哪里放置此代码”...
    • @zneak- 谢谢!这很棒。它开箱即用。现在正在研究如何让 css 使用它。
    • @jaedre619 你学到了什么?当一个人学到一件事时,他们可以自己再做一次。你会写一个正则表达式来解析另一种日志格式吗?还是一个循环?看来您正在寻找可以为您做免费工作的人
    【解决方案2】:

    类似的东西

    $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";
    }
    

    【讨论】:

    • 我不会将 parse_str 用于真正不是 GET 或 POST 数据的东西。
    • 所以,您可以随意使用其他东西。总是有不止一种方法可以做到这一点。我更喜欢较短的:-P
    • 没关系。我只是更喜欢不使用函数的方式来处理它们不应该使用的东西。 ;) 只要文件中有一个流浪的&amp;,你的 sn-p 就会中断。
    • @Col Shrapnel - 感谢您的回复。我不需要提取 2-MyLogdate,但如果存在其余属性,则可以。因此,如果 '5-MyDuration' 和 '6-MySize' 没有值,则将单元格留空/空白即可。
    • @jaedre619 问题是不能有“5-MyDuration”,而是“4-MyDuration”。但我希望你有足够的想法/例子来自己完成它
    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2018-10-31
    • 2022-12-07
    • 2012-04-17
    • 2022-01-11
    • 1970-01-01
    • 2021-02-22
    相关资源
    最近更新 更多