Динамическое отображение 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>

Решения на любом языке приветствуются.

 24
Author: dreeves, 2009-02-06

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>";
 82
Author: phihag, 2015-12-26 20:00:28

Вот простая функция для преобразования 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 будет взята в качестве заголовка/заголовка.

Надеюсь, это кому-нибудь поможет. Пожалуйста, прокомментируйте любые недостатки в этом коде.

 11
Author: Joby Joseph, 2013-01-30 15:48:35

Ответ Фихага помещает каждую строку в одну ячейку, в то время как вы просите, чтобы каждое значение было в отдельной ячейке. Это, кажется, делает это:

<?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>";
?>
 2
Author: user3257572, 2015-02-12 13:13:47

HTML... тег может сделать это сам, т.е. без PHP или java.

Или смотрите этот пост для получения полной информации об этом выше (со всеми вариантами..).

Http://www.linuxquestions.org/questions/programming-9/how-to-show-csv-data-as-html-in-internet-explorer-with-filter-buttons-4175443612/

 0
Author: Arun Sangal, 2013-01-10 17:13:01

Работает ли это, если вы избегаете кавычек с помощью \?

Имя, Возраст, Пол

"Кантор\, Георг", 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();
                    }
                };
            }
        };
    }
}
 -1
Author: Kevin, 2009-02-06 03:24:56

Определить "отображать его динамически"? это означает, что таблица создается с помощью javascript и какого-то обновления Ajax-y.. если вы просто хотите создать таблицу с использованием PHP, это действительно не то, что я бы назвал "динамическим"

 -1
Author: Scott Evernden, 2009-02-06 05:50:53

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>
 -1
Author: Zac Zeng, 2013-01-21 02:34:45