ForHosting KIT · Text & AI

Render CSV as a plain-text table

Paste a three-row export of names, roles and cities and get a table where every column lines up, separated by vertical bars, with a dashed rule under the header. Quoted values, semicolons and tabs are handled. Free in your browser.

  • Free
  • Runs in your browser
  • No sign-up
  • Your data stays on your device
Use it from WebAPIEmailTelegramApp soon

aligned columns, free online

Why render CSV as a fixed-width table

CSV is the format data travels in, but it is a terrible format to read. A column of long values pushes the next field far to the right on one row and not on another, so the eye loses the alignment after two lines. Spreadsheets fix this by hiding the text entirely, which is exactly what you do not want when the destination is a terminal log, a pull request comment, an email in plain text or documentation in Markdown.

A csv to ascii table renderer keeps the data as text — copyable, diffable, greppable — while restoring the one thing a spreadsheet gave you: columns that line up. Paste the export, get back a block where every field sits at the same offset on every row, with a dashed rule under the header. Because the output is plain text, it survives being pasted into any tool, any chat and any code review without reformatting, and it reads the same on a phone screen as on a wide monitor.

How the parsing and alignment work

The parser follows the RFC 4180 conventions: a field wrapped in double quotes may contain the delimiter, line breaks and literal quotes written as two double-quote characters, and blank lines are ignored. That matters in practice because real exports quote fields exactly when they contain something interesting — an address with a comma, a note with a semicolon, a message with a line break. After parsing, the renderer checks that every row has the same number of fields as the first row.

If you would rather see the data anyway, set lenient to true and short rows are padded with empty cells up to the widest row. Column widths are then computed as the longest cell in each column, every cell is padded to that width, and columns are joined with a vertical bar. When the first row is a header, a rule of dashes is drawn beneath it.

Everything is deterministic: the same input always produces byte-identical output.

Delimiters, headers and everyday use

Not every CSV uses a comma. European exports frequently use semicolons, and many database dumps use tabs or pipes. Pass the character in the delimiter field and everything else works the same — quoted fields, error detection, lenient padding.

If your data has no header row, set header to false and the first row is rendered as data with no separator line. The capability runs at the edge with nothing stored: the text is parsed, rendered and discarded. Typical callers are release scripts that print a summary table into CI logs, bots that answer with a readable table in chat, and documentation generators that embed aligned sample data.

Inputs up to one megabyte and fifty thousand rows are accepted, which comfortably covers any export a human would paste and most machine-generated ones.

Readable tables in CI logs

Print build or migration summaries as aligned tables in plain-text logs instead of raw comma-separated lines nobody reads.

Paste data into chats and tickets

Format a CSV export once and paste it into Slack, an issue or an email where it stays aligned and readable.

Embed sample data in documentation

Render example datasets as fixed-width blocks in READMEs and docs without maintaining the padding by hand.

Is my CSV stored?

No. The text is parsed, rendered and discarded; only the table is returned.

What happens when a row has the wrong number of columns?

Set lenient to true to pad short rows with empty cells instead.

Are quoted fields with commas inside supported?

Yes. The parser follows RFC 4180: quoted fields may contain the delimiter, line breaks and escaped quotes written as two double quotes.

Can I use a semicolon or tab instead of a comma?

Yes. Pass any single character in the delimiter field; it defaults to a comma.

What if my data has no header row?

Set header to false and the first row is rendered as data, with no separator line drawn.

Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.

POSThttps://api.kit.forhosting.com/text/csv-to-table

Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.

curl -X POST https://api.kit.forhosting.com/text/csv-to-table \
  -H "Authorization: Bearer $KIT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"csv":"name,role,city\nAda Lovelace,Engineer,London\nGrace Hopper,Admiral,New York\nAlan Turing,Mathematician,London"}'
{
  "csv": "name,role,city\nAda Lovelace,Engineer,London\nGrace Hopper,Admiral,New York\nAlan Turing,Mathematician,London"
}
{
  "task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
  "type": "text.csv_to_table",
  "status": "queued",
  "_links": {
    "result": "/tasks/tsk_…/result"
  }
}

The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.

Per request$0.002

Published price — no tokens, no invented credits. A failed task is never charged.

max_mb1
max_rows50000
HTTPCodeMeaning
401unauthorizedMissing or invalid API key.
402insufficient_balanceYour balance doesn't cover the task price.
404unknown_typeThat task type doesn't exist.
429rate_limitedToo many requests. Use the webhook instead of polling.

The CSV to plain-text table API takes raw CSV text and renders it as a neatly aligned, monospaced table you can paste into a terminal, a README, a commit message or a chat. It parses quoted fields correctly — commas, semicolons and newlines inside quotes are handled — computes the width of every column, pads each cell so the columns line up, and draws a separator line under the header. When a row has a different number of fields than the header, the call fails with a clear error instead of producing a crooked table, unless you set the lenient flag to pad short rows with empty cells.

How the parsing and alignment work

If one does not, the call fails with an error naming the row and both counts: a row with a missing trailing comma renders as a visibly shifted table, and a shifted table is worse than no table at all.

Delimiters, headers and everyday use

The same code also runs free in your browser on this page, so you can format a pasted export without an account and only pay $0.002 per call when you automate it through the API.

What does it cost?

$0.002 per request via the API. It is also free to run in your browser on this page.

How large an input can it take?

Up to 1 MB and 50,000 rows per request, which covers any export meant to be read by a human.

Read the full KIT documentation →