2009-08-16 133 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),然後對爆炸數組的元素進行處理,而不用擔心它們內部的內容。