2009-02-06 35 views
24

Tôi muốn lấy tệp CSV ở phía máy chủ và hiển thị động dưới dạng bảng html. Ví dụ: này:Hiển thị động tệp CSV dưới dạng bảng HTML trên trang web

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

nên trở thành này:

<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> 

Solutions bằng ngôn ngữ nào được hoan nghênh.

Trả lời

80

Các previously linked solution là một mảnh khủng khiếp của mã; gần như mọi dòng đều có lỗi. Sử dụng fgetcsv thay thế:

<?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

Rực rỡ! Cảm ơn bạn rất nhiều. Tôi nghĩ tôi sẽ tiếp tục và xóa liên kết đó khỏi câu hỏi. – dreeves

+0

Chỉ muốn nói, đây là mã tốt nhất mà tôi đã tìm thấy cho đến nay - cũng được thực hiện sir! – user2656127

+1

Chỉ cần dán bản sao! Cảm ơn! :) –

-1

Tính năng này có hoạt động nếu bạn thoát khỏi dấu phẩy được trích dẫn bằng \?

Tên, Tuổi, Giới tính

"Cantor \, Georg", 163, M

định dạng phân Hầu hết các yêu cầu của họ delimiter được thoát để phân tích đúng.


Một Java thô dụ:

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

Tôi không nghĩ rằng giải pháp mẫu xử lý điều đó. Nhưng tôi cũng không nghĩ rằng việc thoát khỏi dấu phẩy là cần thiết, vì chúng được trích dẫn. (Dấu ngoặc thoát, mặt khác, có.) Ví dụ, mysql xuất khẩu sang CSV mà không có dấu phẩy thoát. – dreeves

-1

xác định "hiển thị động"? ngụ ý rằng bảng đang được xây dựng thông qua javascript và một số loại cập nhật Ajax-y .. nếu bạn chỉ muốn xây dựng bảng bằng cách sử dụng PHP thực sự không phải cái tôi gọi là 'động'

+0

Php tạo ra nó phía máy chủ cho mỗi yêu cầu web là đủ tốt cho tôi. Nếu bạn có một giải pháp ajaxy nó sẽ là tuyệt vời để bao gồm nó ở đây cho những người khác tìm kiếm điều này sau này. – dreeves

10

Đây là một hàm đơn giản để chuyển đổi csv để html bảng sử dụng php:

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); 
} 

người ta có thể gọi hàm này như jj_readcsv('image_links.csv',true);

nếu tham số thứ hai là đúng thì hàng đầu tiên của csv sẽ được thực hiện như tiêu đề/title.

Hy vọng điều này sẽ giúp ai đó. Xin vui lòng bình luận cho bất kỳ sai sót trong mã này.

+1

+1 để thêm vòng lặp tiêu đề. – jeynon

-1

XmlGrid.net có công cụ để chuyển đổi csv để html bảng. Dưới đây là liên kết: http://xmlgrid.net/csvToHtml.html

tôi đã sử dụng dữ liệu mẫu của bạn, và nhận được bảng html sau: Câu trả lời

<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> 
+1

Anh ấy nói "động", giải pháp của bạn không cho phép –

2

phihag của đặt mỗi hàng trong một tế bào duy nhất, trong khi bạn đang yêu cầu cho mỗi giá trị là trong một ô riêng biệt.Điều này dường như làm điều đó:

<?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>"; 
?> 
Các vấn đề liên quan