CSV to HTML Table
CSV in eine HTML-Tabelle umwandeln
CSV-Eingabe
HTML-Ausgabe
Was ist CSV-zu-HTML-Tabellen-Konvertierung?
Die Konvertierung von CSV in eine HTML-Tabelle nimmt kommagetrennte Werte und wandelt sie in strukturiertes HTML-Markup um, das Browser als visuelle Tabelle darstellen können. Die Ausgabe verwendet Standard-HTML-Tabellenelemente aus dem HTML Living Standard: table, thead, tbody, tr, th und td. Dabei wird jede CSV-Zeile auf ein tr-Element und jedes Feld auf eine td- oder th-Zelle abgebildet.
CSV-Dateien speichern Daten als Klartext, wobei Zeilen durch Zeilenumbrüche und Felder durch Trennzeichen (in der Regel Kommas) getrennt sind. Obwohl CSV gut für die Datenspeicherung und den Transfer zwischen Anwendungen wie Excel, Google Sheets und Datenbanken geeignet ist, fehlt ihm eine Präsentationsschicht. HTML-Tabellen fügen diese Schicht hinzu, indem sie Daten in semantisches Markup einbetten, das die Formatierung per CSS, das Sortieren per JavaScript und Barrierefreiheit über Attribute wie scope und aria-label ermöglicht.
Bei der Konvertierung müssen mehrere Sonderfälle nach RFC 4180 berücksichtigt werden: Felder in Anführungszeichen, die Kommas oder Zeilenumbrüche enthalten, maskierte doppelte Anführungszeichen innerhalb von Feldern sowie abweichende Trennzeichen (Semikolons, Tabs, Pipes). Ein korrekter Konverter maskiert außerdem HTML-Entitäten im Zellinhalt und ersetzt <, >, & sowie Anführungszeichen durch ihre Entity-Entsprechungen, um fehlerhaftes Markup und XSS-Schwachstellen zu verhindern.
Warum einen CSV-zu-HTML-Tabellen-Konverter verwenden?
HTML-Tabellen von Hand zu erstellen ist mühsam und fehleranfällig, besonders bei Datensätzen mit Dutzenden von Spalten oder Hunderten von Zeilen. Dieser Konverter übernimmt Parsing, Escaping und Formatierung in einem Schritt.
Anwendungsfälle für CSV zu HTML
Referenz der HTML-Tabellenelemente
Eine gut strukturierte HTML-Tabelle verwendet semantische Elemente, die Kopfzeilen, Inhalt und Fußzeile trennen. Screenreader und Suchmaschinen nutzen diese Elemente, um die Tabellenstruktur zu verstehen. Die Gruppierung von Zeilen mit thead, tbody und tfoot ermöglicht es Browsern, unabhängiges Scrollen anzuwenden und Kopfzeilen in Drucklayouts zu wiederholen.
| Element | Funktion | Hinweise |
|---|---|---|
| <table> | Table root | Wraps the entire table structure |
| <thead> | Header group | Contains header rows; browsers repeat on print page breaks |
| <tbody> | Body group | Contains data rows; enables independent scrolling with CSS |
| <tfoot> | Footer group | Summary or totals row; renders after tbody |
| <tr> | Table row | Groups cells horizontally |
| <th> | Header cell | Bold and centered by default; supports scope attribute for accessibility |
| <td> | Data cell | Standard content cell; accepts any inline or block HTML |
| <caption> | Table caption | Visible title above the table; read by screen readers first |
| <colgroup> | Column group | Applies width or style to entire columns without per-cell classes |
CSV vs. HTML-Tabelle
CSV ist ein Transportformat, das auf Einfachheit optimiert ist, während HTML ein Präsentationsformat ist, das auf Rendering, Barrierefreiheit und Interaktivität im Browser ausgelegt ist.
Code-Beispiele
So lässt sich CSV programmgesteuert in verschiedenen Sprachen in HTML-Tabellen umwandeln. Jedes Beispiel verarbeitet die Kopfzeile separat und maskiert HTML-Entitäten im Zellinhalt. Diese Snippets können direkt in ein Skript, eine Build-Pipeline oder einen Backend-API-Endpunkt eingefügt werden, der HTML-Berichte aus Datenexporten erzeugt.
// CSV string → HTML table with thead/tbody
const csv = `name,age,city
Alice,30,Berlin
Bob,25,Tokyo`
function csvToHtmlTable(csv) {
const rows = csv.trim().split('\n').map(r => r.split(','))
const [headers, ...data] = rows
const ths = headers.map(h => `<th>${h}</th>`).join('')
const trs = data.map(row =>
' <tr>' + row.map(c => `<td>${c}</td>`).join('') + '</tr>'
).join('\n')
return `<table>
<thead><tr>${ths}</tr></thead>
<tbody>
${trs}
</tbody>
</table>`
}
console.log(csvToHtmlTable(csv))
// → <table><thead><tr><th>name</th>...</tr></thead><tbody>...</tbody></table>import csv, io, html
csv_string = """name,age,city
Alice,30,Berlin
Bob,25,Tokyo"""
reader = csv.reader(io.StringIO(csv_string))
headers = next(reader)
lines = ['<table>', ' <thead>', ' <tr>']
for h in headers:
lines.append(f' <th>{html.escape(h)}</th>')
lines += [' </tr>', ' </thead>', ' <tbody>']
for row in reader:
lines.append(' <tr>')
for cell in row:
lines.append(f' <td>{html.escape(cell)}</td>')
lines.append(' </tr>')
lines += [' </tbody>', '</table>']
print('\n'.join(lines))
# → well-formed HTML table with escaped special characters<?php
$csv = "name,age,city\nAlice,30,Berlin\nBob,25,Tokyo";
$rows = array_map('str_getcsv', explode("\n", trim($csv)));
$headers = array_shift($rows);
echo "<table>\n <thead>\n <tr>\n";
foreach ($headers as $h) {
echo " <th>" . htmlspecialchars($h) . "</th>\n";
}
echo " </tr>\n </thead>\n <tbody>\n";
foreach ($rows as $row) {
echo " <tr>\n";
foreach ($row as $cell) {
echo " <td>" . htmlspecialchars($cell) . "</td>\n";
}
echo " </tr>\n";
}
echo " </tbody>\n</table>";
// → <table><thead>...<th>name</th>...</thead><tbody>...</tbody></table># Using awk — quick one-liner for simple CSV (no quoted fields)
awk -F, 'NR==1{print "<table><thead><tr>";for(i=1;i<=NF;i++)print "<th>"$i"</th>";print "</tr></thead><tbody>"}
NR>1{print "<tr>";for(i=1;i<=NF;i++)print "<td>"$i"</td>";print "</tr>"}
END{print "</tbody></table>"}' data.csv
# Using Python one-liner for RFC 4180-compliant parsing
python3 -c "
import csv, sys, html
r=csv.reader(sys.stdin); h=next(r)
print('<table><thead><tr>')
print(''.join(f'<th>{html.escape(c)}</th>' for c in h))
print('</tr></thead><tbody>')
for row in r:
print('<tr>'+''.join(f'<td>{html.escape(c)}</td>' for c in row)+'</tr>')
print('</tbody></table>')
" < data.csv