Sample CSV Files

Eight files to download, each one built to exercise something specific. A clean file for the happy path, a broken one for your error handling, a semicolon file for delimiter sniffing, a unicode file for encoding, a 60 column file for anything that assumes five, and 10,000 rows for when the timing has to mean something. All synthetic, all free for any use.

865 KB for the whole set. No sign-up, no email, no download counter.

Files that exist for a reason

Search for a sample CSV and you get twenty pages offering the same three files: a list of names, a list of cities, and something about superstore sales. They are fine for a screenshot and useless for the thing people usually need test data for, which is finding out what happens when the input is not fine.

So each file below was written to break or exercise one specific behaviour, and the description says which. If you are testing delimiter detection, one of these is semicolon-delimited with decimal commas inside quoted fields. If you are testing type inference, one of them is nothing but leading zeros: ZIP codes, EAN-13 barcodes, and 17 digit account numbers that turn into scientific notation the moment something guesses wrong. If you are testing error paths, one of them is broken in six separate ways at once.

Every file is synthetic. A seeded generator produced them once and the output was committed as it stood, so the bytes never move and a test can assert against them. No real person, company, order or account appears anywhere, and every email address ends in example.com, the domain reserved for exactly this purpose.

Licence: these files are dedicated to the public domain under CC0 1.0. Use them for anything, commercial work included, with no attribution required and nothing to agree to.

The files

Every link is a direct download from this site. Nothing is zipped, nothing asks for an email.

people-100.csv

6.6 KB (6,798 bytes) · 100 rows x 7 columns

The clean one. Sequential integer ids, first and last names, an email per person, a city, an ISO join date and one of four plan names. Nothing is missing, nothing is quoted, no row is ragged and no value needs escaping. This is the file to reach for when you want to prove the happy path works before you go looking for trouble, and the one to use in a screenshot or a tutorial. Profiled, it comes back as one numeric column, one date column and five text columns, with zero duplicate rows.

Download people-100.csv · open it in the CSV viewer

sales-10k.csv

504.5 KB (516,630 bytes) · 10,000 rows x 7 columns

Enough rows for a measurement to mean something, and typed on purpose so the columns are worth aggregating. An order id, an ISO date spread over two years, one of five regions, one of three channels, a unit count, a decimal amount and a boolean refund flag. Every amount carries non-zero cents so that the column reads back as a genuine number rather than as text. It profiles as 730 distinct dates, five regions, and an amount running from 5.01 to 4800.53 with a median of 2394.21. Pivot it by region and channel and you get a five by three table out of ten thousand rows.

Download sales-10k.csv · pivot it · profile it

messy.csv

13.2 KB (13,468 bytes) · 200 data rows, 6 header names, widest row 8 fields

Broken six ways at once, so one file covers most of an error-handling test. The header uses name twice. Twelve rows carry the wrong number of fields, some short and some long. Six rows are entirely blank. Thirteen lines end in CRLF while 194 end in LF. Fifty cells have leading or trailing whitespace. Two replacement characters sit on line 59, the fingerprint of a file that was decoded as the wrong encoding somewhere upstream. Run it through the validator and all six come back with line numbers. Run it through a parser that pads ragged rows and it reads as 200 rows and 8 columns, with the second name renamed to name_2 and the two unnamed extras called column_7 and column_8.

Download messy.csv · run it through the validator

semicolon-eu.csv

28.5 KB (29,146 bytes) · 500 rows x 7 columns

What Excel writes on a machine whose locale uses a comma for decimals: semicolons between the fields, and amounts like "8.794,14" in quotes with a full stop for thousands and a comma for the decimal. Dates are in DD.MM.YYYY. Customer names carry umlauts and a slash. This is the file that tells you whether a reader sniffs its separator or assumes one, and whether an importer treats a decimal comma as a decimal point, as a thousands separator, or as a reason to give up. A parser that guesses correctly reports seven columns; one that does not reports one.

Download semicolon-eu.csv · change its delimiter

unicode.csv

18.2 KB (18,653 bytes) · 200 rows x 7 columns

Names, cities and short notes in Simplified Chinese, Japanese, Korean, Greek, Russian, Hindi, Arabic and Hebrew, plus accented Latin, a status column carrying emoji, and a column of flag emoji. The two right-to-left scripts matter more than they look: a terminal or a table that measures width in code units will mangle the alignment, and a naive truncation will cut a character in half. The flag column is a good trap on its own, since each flag is two code points and reports a length of 4 rather than 1. Good for testing UTF-8 handling, column widths, sorting and any place where a byte count was used where a character count was meant.

Download unicode.csv · open it in the CSV viewer

wide-60col.csv

173.7 KB (177,833 bytes) · 500 rows x 60 columns

Sixty columns: a row id, a capture date, a segment, then 40 numeric metrics, 12 booleans and 5 label columns. Plenty of tools handle a hundred thousand rows and then lay out badly, scroll strangely or truncate the header once a file goes past a dozen columns. This one is deliberately wider than a screen and narrower than an extreme, so it tests layout and horizontal scrolling rather than a memory limit. It is also a useful pivot input, since the labels give you six column groups against three segments.

Download wide-60col.csv · profile all 60 columns

leading-zeros.csv

16.7 KB (17,095 bytes) · 300 rows x 6 columns

The file that catches the single most common CSV bug. A five digit record id, US ZIP codes that start with 0, EAN-13 barcodes, 17 digit account numbers and a part code with a hyphen in it. Open it in a spreadsheet with default settings and watch 01730 become 1730 and a 17 digit account number turn into 1.234E+16, at which point the last digits are gone for good. Only the quantity column is genuinely numeric, and a tool that gets this right will say so: the other five columns should come back as text with their widths intact, 5 characters for the ZIP, 13 for the barcode, 17 for the account.

Download leading-zeros.csv · convert it to Excel and check

orders.jsonl

104.1 KB (106,567 bytes) · 500 records, 8 top-level fields

One JSON object per line, the shape that eval runs, chat exports, event logs and API dumps all arrive in. Each record carries an order id, a timestamp, a status, a nested customer object with four keys, an item count, a decimal total, a currency and a boolean. The nesting is the point: a converter has to decide whether to flatten it, drop it, or write [object Object] into a cell. Flattened with dot notation the 8 top-level fields become 11 columns, with customer.id, customer.name, customer.city and customer.country in the middle.

Download orders.jsonl · convert it to CSV

Picking the right one

  • Writing a tutorial or taking a screenshot? people-100.csv. Short, readable, nothing surprising in it.
  • Testing error handling? messy.csv. If your code survives that file, it survives most exports.
  • Testing delimiter and locale handling? semicolon-eu.csv. Half of Europe's Excel installs write files that look like this.
  • Testing encoding and text rendering? unicode.csv. Right-to-left text and emoji in the same file.
  • Testing type inference? leading-zeros.csv. Any tool that turns a ZIP code into a number fails visibly.
  • Testing layout? wide-60col.csv. Wider than a screen, so the header handling shows.
  • Testing performance, or want something to aggregate? sales-10k.csv. Ten thousand typed rows.
  • Testing a JSON to CSV path? orders.jsonl. Nested objects, one record per line.

None of these needs to be uploaded to be used here. Every tool on this site reads the file in your own browser, so you can download a sample, drop it straight back into a page, and watch what happens without anything crossing a network.

Frequently Asked Questions

Is any of this real data?

None of it. Every name, address, order, account number and barcode was generated by a script. The people are borrowed from the history of computing, the companies are invented, and every email address ends in example.com, which is the domain reserved by RFC 2606 precisely so that test data cannot reach anybody. There is no personal information in these files and nothing to anonymise.

Can I use these commercially, and do I have to credit you?

Yes, and no. The files are dedicated to the public domain under CC0 1.0. Put them in a course, a paid product, a test suite, a bug report, a screenshot, a conference talk or a book, with or without attribution, and there is nothing to ask for and nothing to sign. A link back is welcome and is not a condition.

Which file should I use to test my CSV parser?

Start with people-100.csv to prove the happy path, then reach for the file that matches the thing you doubt. messy.csv for error handling, semicolon-eu.csv for delimiter sniffing and decimal commas, unicode.csv for encoding and column widths, leading-zeros.csv for type inference, wide-60col.csv for anything that assumes a handful of columns, and sales-10k.csv when you want enough rows for the timing to mean something.

What exactly is wrong with messy.csv?

Six separate things, all of them on purpose. The header uses the name "name" twice. Twelve rows do not carry the header's six fields, some short and some long. Two replacement characters sit on line 59 where an encoding step lost something. Thirteen lines end in CRLF while the other 194 end in LF. Six rows are completely blank. Fifty cells carry leading or trailing whitespace. Run it through the CSV validator and all six come back with line numbers.

Are the files stable, or do they change?

Stable. They were produced once by a seeded generator and committed as fixed files, so the byte count, the row order and every value stay the same. That matters if you are writing a test that asserts a row count or a checksum: the URL will keep serving the same bytes, and any future change would be a new file at a new name rather than a quiet edit to this one.

Why is there a JSONL file on a CSV page?

Because most of the CSVs people are handed today started life as JSON Lines: eval outputs, chat exports, event logs and API dumps all arrive one JSON object per line. orders.jsonl carries a nested customer object inside each record, so it exercises the part of a converter that has to decide what to do with nesting. Flattened with dot notation it becomes eleven columns from eight top-level fields.

Take what you need

Eight files, 865 KB in total, public domain, no sign-up. Download one and drop it straight into any tool on this site.

Back to the files