2009-02-06 216 views
24

我想將一個CSV文件生存在服務器端,並將其動態顯示爲html表格。 例如,這樣的:在網頁上動態顯示CSV文件作爲HTML表格

Name, Age, Sex 
"Cantor, Georg", 163, M 

應該成爲這樣的:在任何語言

<html><body><table> 
<tr> <td>Name</td> <td>Age</td> <td>Sex</td> </tr> 
<tr> <td>Cantor, Georg</td> <td>163</td> <td>M</td> </td> 
</table></body></html> 

解決方案是受歡迎的。

回答

80

previously linked solution是一種可怕的一段代碼;幾乎每一行都包含一個錯誤。改爲使用fgetcsv

<?php 
echo "<html><body><table>\n\n"; 
$f = fopen("so-csv.csv", "r"); 
while (($line = fgetcsv($f)) !== false) { 
     echo "<tr>"; 
     foreach ($line as $cell) { 
       echo "<td>" . htmlspecialchars($cell) . "</td>"; 
     } 
     echo "</tr>\n"; 
} 
fclose($f); 
echo "\n</table></body></html>"; 
+0

太棒了!非常感謝。我想我會繼續,然後從問題中刪除該鏈接。 – dreeves 2009-02-06 04:50:22

+0

只是想說,這是迄今爲止發現的最好的代碼 - 幹得好先生! – user2656127 2013-12-04 10:17:40

+1

只需複製粘貼即可!謝謝! :) – 2015-03-03 06:52:43

-1

如果您用\引用逗號進行轉義,它會起作用嗎?

姓名,年齡,性別

「康托爾\,喬治」,163,男

大多數分隔格式要求其分隔符,以正確地解析轉義。


粗略Java示例:

import java.util.Iterator; 

public class CsvTest { 

    public static void main(String[] args) { 
     String[] lines = { "Name, Age, Sex", "\"Cantor, Georg\", 163, M" }; 

     StringBuilder result = new StringBuilder(); 

     for (String head : iterator(lines[0])) { 
      result.append(String.format("<tr>%s</tr>\n", head)); 
     } 

     for (int i=1; i < lines.length; i++) { 
      for (String row : iterator(lines[i])) { 
       result.append(String.format("<td>%s</td>\n", row)); 
      } 
     } 

     System.out.println(String.format("<table>\n%s</table>", result.toString())); 
    } 

    public static Iterable<String> iterator(final String line) { 
     return new Iterable<String>() { 
      public Iterator<String> iterator() { 
       return new Iterator<String>() { 
        private int position = 0; 

        public boolean hasNext() { 
         return position < line.length(); 
        } 

        public String next() { 
         boolean inquote = false; 
         StringBuilder buffer = new StringBuilder(); 
         for (; position < line.length(); position++) { 
          char c = line.charAt(position); 
          if (c == '"') { 
           inquote = !inquote; 
          } 
          if (c == ',' && !inquote) { 
           position++; 
           break; 
          } else { 
           buffer.append(c); 
          } 
         } 
         return buffer.toString().trim(); 
        } 

        public void remove() { 
         throw new UnsupportedOperationException(); 
        } 
       }; 
      } 
     }; 
    } 
} 
+0

我不認爲該示例解決方案處理該問題。但我也不認爲逃避逗號應該是必要的,因爲它們在引號中。 (轉義引號,另一方面,是的。)例如,mysql導出到CSV而沒有轉義逗號。 – dreeves 2009-02-06 02:17:32

-1

定義「動態顯示」?這意味着該表正在通過JavaScript和某種形式的Ajax-Y更新..建,如果你只是想用PHP這真的不是我所說的「動態」

10

下面是一個簡單的函數轉換爲建表CSV使用PHP到HTML表格:

function jj_readcsv($filename, $header=false) { 
$handle = fopen($filename, "r"); 
echo '<table>'; 
//display header row if true 
if ($header) { 
    $csvcontents = fgetcsv($handle); 
    echo '<tr>'; 
    foreach ($csvcontents as $headercolumn) { 
     echo "<th>$headercolumn</th>"; 
    } 
    echo '</tr>'; 
} 
// displaying contents 
while ($csvcontents = fgetcsv($handle)) { 
    echo '<tr>'; 
    foreach ($csvcontents as $column) { 
     echo "<td>$column</td>"; 
    } 
    echo '</tr>'; 
} 
echo '</table>'; 
fclose($handle); 
} 

一個可以調用等jj_readcsv('image_links.csv',true);

該功能,如果第二個參數爲真,則CSV的第一行將作爲頁眉/標題。

希望這有助於某人。在這段代碼的任何缺陷請評論。

-1

XmlGrid.net有工具來轉換CSV到HTML表格。這裏是鏈接: http://xmlgrid.net/csvToHtml.html

我用您的樣本數據,並得到了下面的HTML表:

<table> 
<!--Created with XmlGrid Free Online XML Editor (http://xmlgrid.net)--> 
<tr> 
    <td>Name</td> 
    <td> Age</td> 
    <td> Sex</td> 
</tr> 
<tr> 
    <td>Cantor, Georg</td> 
    <td> 163</td> 
    <td> M</td> 
</tr> 
</table> 
2

phihag的答案放在一個單細胞的每一行,而你所要求的每個值是在一個單獨的細胞。這似乎做到這一點:

<?php 
// Create a table from a csv file 
echo "<html><body><table>\n\n"; 
$f = fopen("so-csv.csv", "r"); 
while (($line = fgetcsv($f)) !== false) { 
     $row = $line[0]; // We need to get the actual row (it is the first element in a 1-element array) 
     $cells = explode(";",$row); 
     echo "<tr>"; 
     foreach ($cells as $cell) { 
      echo "<td>" . htmlspecialchars($cell) . "</td>"; 
     } 
     echo "</tr>\n"; 
} 
fclose($f); 
echo "\n</table></body></html>"; 
?>