PHP:将不规则的CSV文件格式化为HTML表格

时间:2009-08-16 11:25:03

标签: php html csv

我的客户端会定期收到一组CSV文本文件,其中每行中的元素遵循一致的顺序和格式,但分隔它们的逗号不一致。有时一个逗号会分隔两个元素,有时候会有两个或四个逗号等等......

我写的PHP应用程序尝试执行以下操作:

PSEUDO-CODE: 
1. Upload csv.txt file from client's local directory.
2. Create new HTML table. 
3. Insert the first three fields FROM csv.txt into HTML table row.
4. Iterate STEP 2 while the FIRST field equals the First field below it.
5. If they do not equal, CLOSE HTML table.
6. Check to see if FIRST field is NOT NULL, IF TRUE, GOTO step 2, Else close HTML table.  

我对步骤1和2没有任何问题。由于csv.txt文件中的字段并不总是用相同数量的逗号分隔,因此步骤3变得棘手。但是,它们始终采用相同的相对顺序和格式。我也遇到了第4步的问题。我不知道如何检查一行中的起始字段是否与其下方行中的起始字段匹配。步骤5应该相对简单。对于第6步,我需要在PHP中找到等效的“GOTO”函数。

如果问题的任何部分不清楚,请告诉我。我感谢您的帮助。

提前谢谢!

3 个答案:

答案 0 :(得分:1)

为什么不简单地通过用一个逗号替换任何多个逗号来开始。例如:

ABC,DEF GHI ,, ,,,, JKL

变为:

ABC,DEF,GHI,JKL

然后继续正常。

答案 1 :(得分:1)

如果你的意思是每一行都有不同数量的逗号,那么据我所知,实际上不可能通过单独查看逗号来做你想做的事。例如:

ab,c,d,ef // could group columns a-f in that way, but
a,bc,de,f // could also group columns a-f

......你无法知道哪个是正确的安排,除非你得到一些其他的指示,或者正如其他人所说的那样,正则表达式可以识别数据的类型。

如果另一方面你只是意味着有时会有空白,但仍然有相同数量的列,如下所示:

a,b,,d,e,f
a,,c,d,e,f

...然后你仍然可以正确地形成表格。在这种情况下,我建议使用explode(','$ line),然后对爆炸数组的元素进行处理,而不必担心它们内部的内容。

答案 2 :(得分:1)

如果您想按行第一个元素对行进行分组,可以尝试以下方法:

  • 通过fgetcsv()
  • 阅读下一行
  • 过滤空元素(a ,, b,c - > a,b,c)
  • 如果该行包含字段< - >不为空将该行附加到“其”组

这不是你所描述的,但它可能是你想要的; - )

<?php
$fp = fopen('test.csv', 'rb') or die('!fopen');
$groups = array();
while(!feof($fp)) {
  $row = array_filter(fgetcsv($fp));
  if ( !empty($row) ) {
    // @ because I don't care whether the array exists or not
    @$groups[$row[0]][] = $row;
  }
}

foreach( $groups as $g ) {
  echo '
    <table>';
  foreach( $g as $row ) {
    echo '
      <tr>
        <td>', join('</td><td>', array_map('htmlentities', $row)), '</td>
      </tr>
    ';
  }
  echo '</table>';
}