2009-08-16 140 views
0

我的客户端定期接收一组CSV文本文件,其中每行中的元素遵循一致的顺序和格式,但将它们分开的逗号不一致。有时一个逗号分隔将两个元素和其他时候,它会是两个或四个逗号,等等PHP:将不规则的CSV文件格式化为HTML表格

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.步骤3是棘手的地方,因为csv.txt文件中的字段不总是用相同数量的逗号分隔。然而,它们总是处于相同的相对顺序和格式。我也遇到了第4步的问题。我不知道如何检查一行中的开始字段是否与它下面的行中的开始字段匹配。步骤5应该相对简单。对于第6步,我需要在PHP中找到等价的“GOTO”函数。

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

预先感谢您!

回答

1

如果你想按自己的第一个元素的行你可以尝试这样的:

  • 通过fgetcsv()
  • 过滤空元素读下一行(A ,, B,C - >一个, 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>'; 
} 
1

为什么不简单地用逗号替换任何逗号的倍数来开始。例如:

ABC,DEF ,, GHI JKL ,,,,

变为:

ABC,DEF,GHI,JKL

,然后就继续正常。

+0

这或正则表达式是什么。 关于转到,我相信你不需要转到..是不是在一个循环? – 2009-08-16 11:39:21

+0

确切地说......如果你破坏了数据,你应该在使用它之前修复它,而不是尝试使用破损的数据。 – Greg 2009-08-16 11:40:34

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),然后对爆炸数组的元素进行处理,而不用担心它们内部的内容。