
Clean CSV
A clean, well-formed CSV with a header and 20 rows — the baseline case for CSV parser testing.
- File
- CSV · CSV · 20 rows
- Use case
- CSV parsingData import
Clean and deliberately messy CSVs — quoted commas, embedded newlines, ragged rows, odd delimiters, and encodings.

A clean, well-formed CSV with a header and 20 rows — the baseline case for CSV parser testing.

A deliberately messy CSV: a quoted field with a comma, a quoted field with an embedded newline, escaped double-quotes, and ragged rows with too few and too many fields — the cases that break naïve parsers.

A CSV that uses semicolons as the delimiter (common in European locales) — for testing delimiter detection.

A tab-separated values file with a header and 20 rows — for testing TSV parsing and delimiter handling.

A CSV with no header row — for testing parsers that must infer or be told the column names.

A CSV with 10,000 data rows — for testing streaming parsers, memory handling, and import performance.

A CSV encoded in Latin-1 (ISO-8859-1) with accented names — for testing encoding detection and mis-decoding (it will look wrong if read as UTF-8).

A CSV where missing values are written seven different ways — empty string, NULL, NA, N/A, null, None, and a dash — across text and numeric columns. A fixture for testing null-detection and coercion in CSV importers.

A CSV whose 'value' column mixes integers, floats, scientific notation, dates, hex, thousands separators, and whitespace, and whose 'flag' column mixes a dozen boolean spellings. A torture test for type inference and schema detection.

A CSV with 1000 columns and a handful of rows — a stress test for parsers, spreadsheet importers, and databases with column limits or per-row buffering assumptions. Deterministic (fixed seed).

A CSV listing timestamps in eleven formats — ISO 8601 with Z and numeric offsets, millisecond precision, naive local, date-only, Unix epoch in seconds and milliseconds, US AM/PM, and RFC 1123. A fixture for testing date parsing and timezone normalisation.

A small CSV whose header row repeats the column name id — a common importer failure mode.

SKU identifiers that start with zeros. Spreadsheet tools often coerce these to numbers and drop the zeros — keep them as text.

A sanitization-test CSV with one equals-prefixed cell clearly labelled sample-only. Use it to verify importers neutralize spreadsheet formulas — not an attack list.

Timestamps spanning a US spring-forward DST gap and leap-day dates for timezone and calendar edge-case testing.

A CSV prefixed with a UTF-8 BOM (EF BB BF) and accented / CJK cells — for testing BOM-aware importers.

The same three data rows as UTF-16 little-endian with a BOM — wide-character CSV decoding fixture.

UTF-16 big-endian CSV with BOM — for byte-order detection in tabular importers.

A CP1252 CSV using the 0x80–0x9F range (smart quotes, euro, bullet) that Latin-1 misreads.

A Shift-JIS encoded Japanese CSV — for CJK charset detection and Shift-JIS→UTF-8 conversion in importers.

European-style CSV using semicolons as delimiters and comma decimals — a common locale edge case.

A pipe-delimited (| ) tabular file — for testing non-comma delimiter autodetection.

A .csv file whose content is tab-delimited — tests whether importers sniff delimiters or trust the extension.

A classic fixed-width text extract with documented column positions — for COBOL-style / mainframe importer tests.

A CSV with a quoted field that contains an embedded newline — a classic RFC 4180 parser stress case.

A CSV that mixes CRLF and LF row endings within one file — newline normalisation fixture.

Rows with differing field counts — for testing how importers pad, truncate, or error on ragged CSV.

A CSV with # comment lines mixed among data — common in scientific exports; tests comment skipping.

A one-column CSV of email addresses — edge case for delimiter sniffers that expect commas in every row.

A Latin-1 CSV with high-bit accented characters — for legacy 8-bit charset detection.

Synthetic product-analytics events (signup/login/upgrade) for testing event pipelines and warehouse loads. CSV twin.

A point-of-sale SKU catalog with tax codes and active flags — fictional Meridian Supply inventory. CSV twin.

Synthetic lab readings (temperature, pressure, pH) with ISO timestamps for scientific ETL tests. CSV twin.

Synthetic multi-touch attribution click rows with UTM fields — for marketing analytics importers. CSV twin.

Synthetic finance dataset (ledger-lines) as CSV — for ETL and warehouse loader tests.

Synthetic support dataset (tickets) as CSV — for ETL and warehouse loader tests.

Deterministic synthetic CSV batch 01 for bulk-import smoke tests.

Deterministic synthetic CSV batch 02 for bulk-import smoke tests.

Deterministic synthetic CSV batch 03 for bulk-import smoke tests.

Deterministic synthetic CSV batch 04 for bulk-import smoke tests.

Deterministic synthetic CSV batch 05 for bulk-import smoke tests.

Deterministic synthetic CSV batch 06 for bulk-import smoke tests.

Deterministic synthetic CSV batch 07 for bulk-import smoke tests.

Deterministic synthetic CSV batch 08 for bulk-import smoke tests.

Deterministic synthetic CSV batch 09 for bulk-import smoke tests.

Deterministic synthetic CSV batch 10 for bulk-import smoke tests.

Deterministic synthetic CSV batch 11 for bulk-import smoke tests.

Deterministic synthetic CSV batch 12 for bulk-import smoke tests.

Deterministic synthetic CSV batch 13 for bulk-import smoke tests.

Deterministic synthetic CSV batch 14 for bulk-import smoke tests.

Deterministic synthetic CSV batch 15 for bulk-import smoke tests.

Deterministic synthetic CSV batch 16 for bulk-import smoke tests.

Deterministic synthetic CSV batch 17 for bulk-import smoke tests.

Deterministic synthetic CSV batch 18 for bulk-import smoke tests.

Deterministic synthetic CSV batch 19 for bulk-import smoke tests.

Deterministic synthetic CSV batch 20 for bulk-import smoke tests.

Synthetic hr dataset (employees-mini) as CSV — for ETL and warehouse loader tests.

Synthetic iot dataset (sensor-readings-mini) as CSV — for ETL and warehouse loader tests.

Sensor readings at irregular minute gaps — tests time-series resampling and gap detection.

JSON twin of irregular-interval sensor readings for charting library tests.

Hourly load data skipping the 03:00 hour on DST spring-forward day — tests timezone/DST gap handling.

Load readings with a repeated 01:00 local hour on fall-back DST — tests ambiguous timestamp handling.

Two rows share the same timestamp key — tests deduplication and last-write-wins policies.

JSON array with duplicate timestamp keys for ingestion pipeline tests.

Series with an explicit null value at a missing sample point.

Timestamps out of chronological order — tests sort-on-ingest behaviour.

Same nominal instant expressed in Z, -05:00, and +09:00 offsets.

CSV with NaN string and empty cells representing missing measurements.

Sub-second millisecond timestamps for precision parsing tests.

Hourly order counts weekdays only (09–16 UTC) across three SAMPLE days.

Pre-aggregated weekly totals JSON for rollup/chart tests.

Readings spanning Feb 29 leap day — calendar edge case.

Timestamps at Unix epoch and classic 32-bit Y2038 boundary.

Sparse event log in JSON Lines — two events hours apart for event-stream ingestion tests.

Synthetic patient demographics CSV for EHR import and de-identification pipeline tests.

Synthetic lab result rows for clinical data warehouse import tests.

Synthetic bank transaction history for personal-finance importer tests.

Fictional SKU catalog for ERP and POS import tests.

Cycle-count variance SAMPLE for inventory audit reconciliation tests.

Tiny SAMPLE CSV (semicolon-eu) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (pipe-delimited) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (hash-commented) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (quoted-embedded-comma) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (quoted-embedded-newline) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (empty-fields) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (trailing-comma) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (header-only) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (single-column) exercising delimiter/quoting edge behaviour.

Tiny SAMPLE CSV (mixed-quoting) exercising delimiter/quoting edge behaviour.

CSV twin of the multi-currency SAMPLE invoice ledger.

CSV action-item export twin for the SAMPLE meeting notes.

CSV twin of the SAMPLE OKR sheet.

CSV Annex A twin listing fictional SAMPLE subprocessors for the deep DPA.

SAMPLE CSV export row for the employment form submission shape.

SAMPLE CSV export row for the housing form submission shape.

SAMPLE CSV export row for the nonprofit form submission shape.

SAMPLE CSV export row for the events form submission shape.

SAMPLE CSV export row for the finance form submission shape.

SAMPLE CSV export row for the education form submission shape.

SAMPLE CSV export row for the parking form submission shape.

SAMPLE CSV export row for the events form submission shape.

A flat table of the HTML5 constraint attributes: what each applies to, whether the browser enforces it, whether it blocks submission, and one valid and one invalid example. The spreadsheet-shaped twin of the JSON constraint rules.

Twenty input types crossed with the seven attributes that may or may not apply to them, so a form builder can be checked for attributes it emits on controls that ignore them.

The autofill tokens as a flat table with their group, the prefixes each accepts, the control type they usually sit on and a sample value. Useful for driving a data-driven autofill test.

Fifteen awkward field names with the urlencoded key each produces: brackets, array notation, spaces, plus signs, ampersands, equals signs and three non-ASCII scripts including an astral emoji.

Twelve fictional submissions in one export, including values with commas, embedded quotation marks, an embedded newline, an empty cell and non-ASCII text. Sized for testing an importer rather than a database.

Intentionally corrupt. A submissions export whose header declares eight columns while its three data rows carry six, ten and eight, so a reader has to choose between padding, truncating and refusing.

SAMPLE GDPR-style ZIP dominated by activity/devices/sessions CSVs — fictional PII.

SAMPLE devices CSV twin for privacy-export tooling.

A 3-class confusion matrix as CSV — rows are the true class, columns the predicted class, cells the counts. Paired with a JSON twin for testing metric parsers and evaluation visualisers.

An ROC curve as CSV — decision threshold with the corresponding false-positive and true-positive rates, monotonic from (0,0) to (1,1). A fixture for testing chart tools and AUC calculators.

3×3 confusion matrix CSV for classification metric calculators.

One row per language, one column per CLDR plural category, filled with the smallest integers that select it — the sheet to hand a translator or a PM when explaining why 'one' and 'other' is not enough. Japanese needs one form and Welsh needs six.

A flat index of the bidi cases in this wave — which mark each one uses, what it should render as, and why the neutral characters involved need help. Row b8 is the control case with no marks, against which the other seven are compared.

The same number, 1234567.89, rendered for twelve locales, with the group and decimal separator that produced each one named by code point and present literally in the cell. Four of the separators are not ASCII — U+00A0, U+202F, U+2019 and U+066C — and ar-EG additionally switches the digits themselves.

12345.60 in each locale's own currency, with the fraction-digit count and the symbol placement that produced it. JPY takes zero decimals and rounds; six rows separate the amount from the symbol with U+00A0 rather than a plain space; and ar-EG puts the amount in Arabic-Indic digits.

Short and medium date patterns, the short time pattern and the hour cycle for ten locales, each with the rendering of 2026-03-14T09:05. The ar-EG patterns contain U+200F between their fields and ru-RU's medium pattern ends in a quoted literal, so neither is the plain ASCII it appears to be.

The answer key for the timing race family: the flake rate a detector should derive from the five build reports next to it. Exactly one of the six tests is unstable, at a rate of 2/5; the other five are stable at 0.00.

The answer key for the order dependent family: the flake rate a detector should derive from the five build reports next to it. Exactly one of the six tests is unstable, at a rate of 2/5; the other five are stable at 0.00.

The answer key for the network dependency family: the flake rate a detector should derive from the five build reports next to it. Exactly one of the six tests is unstable, at a rate of 2/5; the other five are stable at 0.00.

The answer key for the quarantined after two failures family: the flake rate a detector should derive from the five build reports next to it. Exactly one of the six tests is unstable, at a rate of 5/5; the other five are stable at 0.00.

The aggregate answer key for the 40-build history in this group: runs, passes, failures and failure rate per test, with each test labelled stable or flaky. Use it to score a detector rather than eyeballing 240 JSONL records.

The same coverage as a flat table with a TOTAL row, for spreadsheets, trend charts and diffing two runs without an XML parser. The TOTAL row is the arithmetic sum of the four file rows, so it doubles as a checksum on any tool that regenerates it. Every file in this group describes the same four-file source tree and reports 127/140 lines, 17/24 branch outcomes and 18/20 functions, so a converter can be diffed against a known answer.

Three hundred individual request records with timestamp, scenario, status and duration — the raw log a percentile calculation has to be computed from rather than read off. A handful of 4xx and 5xx responses are mixed in so an error-rate calculation has something to find.

The percentile table a performance report renders as a chart, with mean, p50, p95, p99 and max for each of the four scenarios. The same numbers appear inside the JSON summary in this group, so a chart built from either source can be diffed against the other.

Twelve test cases with level, priority, the requirement each covers, preconditions, steps and expected result — the table a test-management import expects. Eleven of the twelve are automated, and the requirement column joins this file to the traceability matrix next to it.

Thirteen requirements mapped to the test cases that cover them — and one, REQ-PAY-02, deliberately covered by nothing. A coverage-gap report that does not surface that row is not working, which makes this the answer key for exactly that check.

The same 13 spans flattened to a CSV table — span and parent IDs, service, name, kind, start timestamp, duration and status. The shape a trace store exports for spreadsheet analysis, and a readable ground truth to diff the three JSON twins against.

The same 90 samples as the query_range response, exported one row per observation with both epoch and ISO 8601 timestamps. The long layout every dataframe library prefers, and half of a reshaping pair.

The same 90 samples pivoted to one column per service and one row per timestamp — the layout a spreadsheet chart expects. Paired with the long-format export so a reshape can be scored in both directions.

A day-by-day burndown of the availability SLO defined in the OpenSLO fixture: achieved ratio, budget consumed and remaining, and one-hour and six-hour burn rates. Consumption is monotonic across the window, which is the invariant a burn-rate chart must not violate.

The same fictional component tree flattened to a spreadsheet-friendly CSV — name, version, licence, depth, purl and a SHA-256 prefix — for testing the export path SBOM tools offer alongside JSON. Every package, version, hash and licence is fictional — the tree describes nothing real.

Declared range against resolved version for every fictional package pinned by the lockfiles in this category — the table a review needs to see which pins drifted from their manifest ranges. Every package, version, hash and licence is fictional — the tree describes nothing real.

The four SAMPLE advisories flattened to one row each — the export a security review circulates, and the reference answer for any converter run against the Trivy, Grype or OSV reports here. Advisory identifiers use the invented NOVUS-SAMPLE namespace with SAMPLE-CVE aliases; no identifier here refers to a published CVE, GHSA or OSV record, and no package named exists.

A severity-band table mapping CVSS ranges to remediation SLAs and gate actions, with the finding count each band has in this fixture set — so a policy engine can be tested end to end. Advisory identifiers use the invented NOVUS-SAMPLE namespace with SAMPLE-CVE aliases; no identifier here refers to a published CVE, GHSA or OSV record, and no package named exists.

How the nine fictional dependencies distribute across SLSA build levels, with the policy outcome for each band — the table that turns the VSA's dependencyLevels object into something reviewable. Every package, version, hash and licence is fictional — the tree describes nothing real.

Every edge in the fictional dependency graph as one row — parent, child, declared range, resolved version, depth and whether the edge is direct — the form a spreadsheet or SQL import can aggregate. Every package, version, hash and licence is fictional — the tree describes nothing real.

The five towns as a plain CSV with separate longitude and latitude columns — the most common way point data actually arrives. Convert it to GeoJSON and diff against the Point features in the master to score column-order and axis-order handling.

Attributes plus a quoted WKT geometry column — the shape PostGIS `COPY`, DuckDB spatial and QGIS delimited-text imports expect. The geometry field contains commas, so it exercises quoted-field parsing as well as geometry decoding.

Nine control points — the five towns plus Null Island, the equator, a high-latitude point and the Web Mercator latitude limit — with their coordinates in both projections. The two target projections share the x formula and differ only in y, which isolates a latitude-transform bug from a longitude one.

What each decimal place is actually worth on the ground, computed on a sphere of mean Earth radius at the territory's latitude. Longitude degrees are shorter than latitude degrees by the cosine of the latitude, which is why the two columns diverge.

Nine ways of writing zero, what each parses to, and what dividing one by the result gives. Negative zero compares equal to positive zero yet behaves differently in division and in sign propagation, so a formatter that drops the sign changes results without changing any comparison.

Eight arithmetic expressions where binary floating point and exact decimal disagree, with both answers and the signed error side by side. Adding one cent a hundred times does not give one, and this file says by exactly how much.

Five computations done twice, once with the obvious formula and once with the numerically stable one, with the relative error of the naive version alongside. The one-pass variance row is the memorable one: five values a millisecond apart near 1e8 can produce a negative variance.

Twelve doubles printed at 15, 16 and 17 significant digits alongside their shortest round-tripping form, with a column recording which precisions actually recover the original bits. Fifteen digits is the default in a lot of formatting code and it loses values, which this table demonstrates rather than asserts.

The same 1002 numbers added five different ways, giving results from 0 to 1000 for an exact answer of 1000. Floating-point addition is not associative, and this file is the smallest complete demonstration of what that costs a naive accumulator.

A synthetic absorbance scan from 400 to 630 nm with a Gaussian band at 520 nm, carrying its expanded uncertainty at k=2 in a dedicated column and a per-row quality flag. The unit and the coverage factor live in the column names, which is the convention most instrument exports actually use.

The same instrument export with units on a second header row instead of inside the column names, which is how a great many laboratory instruments write CSV. An importer that treats row two as data types every measurement column as text and then quietly refuses to plot anything.

A full day of thermocouple readings at 30-minute cadence with a constant type-B standard uncertainty and two rows flagged as recovering. The timestamps are explicit UTC with a Z suffix so a reader has no excuse to guess a timezone.

Five calibration points with the nominal value, the measured value, the signed error and the expanded uncertainty at k=2 with its confidence level stated. It is a synthetic illustration of the layout, not an accredited certificate, and nothing in it refers to a real instrument or laboratory.

Four batches of five replicate titrations with the mean, sample standard deviation, standard error and relative standard deviation computed for each. The standard deviation uses the n-1 denominator, which is stated explicitly because a population-denominator implementation disagrees on every row.

A five-source uncertainty budget laid out the way the GUM prescribes: each source with its distribution, its divisor, its sensitivity coefficient and its contribution, then the combined and expanded values. Rectangular sources are divided by the square root of three, which is the step budget spreadsheets most often get wrong.

Eight written measurements where the trailing zeros carry the precision of the measurement, alongside what a float parse leaves behind. Parsing 1.200 to the double 1.2 is not a rounding error, it is the loss of the claim that the value is known to four figures.

Nine laboratory results where only four are plain numbers: two are below the detection limit, one is above range, two are missing in different spellings, and one is a legitimate small negative near the blank. Coercing the censored strings to numbers or to NaN both bias the summary, and the file distinguishes every case explicitly.

Six fictional laboratories reporting the same measurand, scored both by z-score against a fixed sigma and by En number against each lab's own claimed uncertainty. The two statistics disagree about which labs are acceptable, which is the point: En rewards an honest uncertainty claim and z does not.

CSV reference listing the four expected HDF5 datasets with shapes and units for lightweight converter assertions. Stable P8 artifact p8-convert-hdf5-summary-csv.
We use Google Analytics and show ads via Adsterra. Non-essential cookies and ad scripts run only after you allow the matching categories. See our cookie policy.