CSV to HTML Table
Konvertera CSV till en HTML-tabell
CSV-inmatning
HTML-utmatning
Vad är CSV till HTML-tabellkonvertering?
CSV till HTML-tabellkonvertering tar kommaseparerade värden och omvandlar dem till strukturerad HTML-uppmärkning som webbläsare kan rendera som en visuell tabell. Utmatningen använder standard-HTML-tabellselement definierade i HTML Living Standard: table, thead, tbody, tr, th och td. Processen mappar varje CSV-rad till ett tr-element och varje fält till en td- eller th-cell.
CSV-filer lagrar data som ren text med rader separerade av radbrytningar och fält separerade av avgränsare (vanligtvis kommatecken). Medan CSV fungerar bra för datalagring och överföring mellan program som Excel, Google Sheets och databaser, saknar det ett presentationslager. HTML-tabeller lägger till det lagret genom att omsluta data i semantisk uppmärkning som stöder formatering med CSS, sortering med JavaScript och tillgänglighet via attribut som scope och aria-label.
Konverteringen måste hantera flera specialfall definierade i RFC 4180: citerade fält som innehåller kommatecken eller radbrytningar, undkomna dubbla citattecken inom fält och varierande avgränsare (semikolon, tabbar, pipe-tecken). En korrekt konverterare undkommer även HTML-entiteter i cellinnehåll, och ersätter <, >, & och citattecken med sina entitetsekvivalenter för att förhindra trasig uppmärkning eller XSS-sårbarheter.
Varför använda en CSV till HTML-tabellkonverterare?
Att bygga HTML-tabeller för hand är tidskrävande och felbenäget, särskilt för datamängder med dussintals kolumner eller hundratals rader. Den här konverteraren hanterar tolkning, undantagshantering och formatering i ett enda steg.
Användningsfall för CSV till HTML-tabell
Referens för HTML-tabellselement
En välstrukturerad HTML-tabell använder semantiska element som separerar huvud, brödtext och sidfot. Skärmläsare och sökmotorer använder dessa element för att förstå tabellstrukturen. Gruppering av rader med thead, tbody och tfoot låter webbläsare tillämpa oberoende rullning och upprepa rubrikrader i utskriftslayouter.
| Element | Roll | Noteringar |
|---|---|---|
| <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-tabell
CSV är ett transportformat optimerat för enkelhet, medan HTML är ett presentationsformat optimerat för rendering, tillgänglighet och interaktivitet i webbläsare.
Kodexempel
Här är hur du konverterar CSV till HTML-tabeller programmatiskt i olika språk. Varje exempel hanterar rubrikraden separat och undkommer HTML-entiteter i cellinnehåll. Dessa kodavsnitt är redo att användas i ett skript, en byggpipeline eller en backend-API-endpoint som genererar HTML-rapporter från dataexporter.
// 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