Динамическое отображение 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>
Решения на любом языке приветствуются.
7 answers
Ранее связанное решение - ужасный фрагмент кода; почти каждая строка содержит ошибку. Используйте 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>";
Вот простая функция для преобразования csv в таблицу html с помощью 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);
}
Эту функцию можно вызвать следующим образом jj_readcsv('image_links.csv',true);
Если второй параметр имеет значение true, то первая строка csv будет взята в качестве заголовка/заголовка.
Надеюсь, это кому-нибудь поможет. Пожалуйста, прокомментируйте любые недостатки в этом коде.
Ответ Фихага помещает каждую строку в одну ячейку, в то время как вы просите, чтобы каждое значение было в отдельной ячейке. Это, кажется, делает это:
<?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>";
?>
HTML... тег может сделать это сам, т.е. без PHP или java.
Или смотрите этот пост для получения полной информации об этом выше (со всеми вариантами..).
Работает ли это, если вы избегаете кавычек с помощью \?
Имя, Возраст, Пол
"Кантор\, Георг", 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();
}
};
}
};
}
}
Определить "отображать его динамически"? это означает, что таблица создается с помощью javascript и какого-то обновления Ajax-y.. если вы просто хотите создать таблицу с использованием PHP, это действительно не то, что я бы назвал "динамическим"
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>