Random TSV Generator

Sample data built from a seed, so the file you hand a colleague matches the one that broke your importer. Pick columns, set the row count, then switch on the rough edges real exports carry: stray tabs inside values, empty cells, leading zeros, rows with the wrong field count.

Start from

Columns

0 columns

Rough edges. Each one puts a specific defect into a small share of rows, the kind that reaches you from a real spreadsheet export.

Pick a starting shape above, then generate.

0Rows
0Columns
0Cells
0 BSize
0Empty cells
0Bad rows

The seed is the part worth caring about

Most sample data is thrown away a minute after someone looks at it. The moment a test fails, that becomes a problem: the file that triggered the failure is gone, and the next click produces different rows.

A seed fixes that. Every value on this page comes out of a small deterministic generator started from the text in the seed box. Type toolexe, keep the same columns, and row 47 holds the same email address today, tomorrow, and on a colleague's machine. Write the seed into your test file next to the expected output and the whole scenario replays on demand.

Change one character of the seed and the entire table changes. That is the point. When you need a fresh sample, press New. When you need yesterday's sample, type yesterday's seed.

Building a file, start to finish

  1. Pick a starting shape from the row of presets. Each one loads a column set and a row count that match a real table, so you rarely start from an empty list.
  2. Rename the columns to match your schema. Header text goes into the file exactly as typed, so user_id and User ID both work, and your parser sees whichever one you wrote.
  3. Set the type per column. Numeric types show a minimum and maximum pair, which keeps salaries out of the single digits and quantities out of the thousands.
  4. Set the row count and the seed. Small counts read better while you are still shaping the columns. Raise the count once the header line looks right.
  5. Switch on the rough edges the importer should survive. The table view highlights every damaged cell in place, so you see what the parser will hit.
  6. Copy for a quick paste into a sheet, or download the file when a script or an upload form needs to read it.

Column types and what each one tests

Types were chosen for the failure they provoke, not for variety. A generator that only produces neat names and round numbers proves very little.

TypeSample valueWhat it exercises
Row ID1000, 1001, 1002Sequential keys, so a duplicate import is obvious at a glance
UUID v49f2c1ab4-3d7e-4a01-b2f0-5c8d61e4a7bb36 character keys, wide enough to expose column truncation
Emailpriya.nair@toolexe.comUniqueness checks and address validation rules
Timestamp2025-11-04T09:16:23ZISO 8601 parsing and time zone handling
Date2026-02-19Date columns that arrive as text and stay text
Price128.40Two decimal places, including values ending in zero
Integer range42Bounds you set, useful for quantity and count fields
Decimal range0.8134Four decimal places, for rates and scores
Booleantrue, falseWhether your loader reads text booleans or expects 0 and 1
IPv4198.51.44.7Log tables and address parsing
SKU codeSKU-KTP-084Mixed letters and digits that break naive numeric casts
Always emptyA column that is blank in every row, which some parsers drop entirely

Names come from a mixed pool across several regions rather than a list of English placeholders. Sample data full of identical filler names hides sorting and collation bugs that show up the first week after launch.

Rough edges, and the bug each one finds

Clean data passes every test. Real exports arrive from spreadsheets, from support agents pasting into a form, and from systems built before anyone agreed on a format. Each toggle reproduces one defect that reaches production files often.

Tab inside a value

The defect TSV has no answer for. Unlike CSV, there is no quoting rule in common use, so a tab pasted into a note field silently adds a column to that row. Your parser reports the wrong field count, or worse, reports nothing and shifts the data.

Empty cells

Two tabs in a row. Whether that means an empty string, a null, or a zero is a decision your loader makes, and most loaders make it inconsistently across column types.

Leading zeros

A code like 004821 survives the file and dies in the spreadsheet, where it becomes 4821. Any round trip through Excel needs this case in the fixture.

Accents and non-Latin text

Names such as Ayşe Yıldız and Nguyễn Hà break byte-length assumptions, sort in surprising orders, and turn into question marks the moment a connection defaults to Latin-1.

Padding spaces

Two invisible spaces on a key. The row looks correct in every view and fails every join. Trimming on import is the fix, and this toggle proves whether you do.

Ragged rows

A row with one field too few or too many. Importers align by position, so one missing tab pushes every later value one column left for the rest of that row.

The bad row meter counts the rows carrying a stray tab or a wrong field count. Treat that number as your target: an importer that rejects those rows with a line number is doing its job, and one that swallows them without a word is the reason this page exists.

Loading the file where it needs to go

Tabs are the reason TSV survives in data work. No quoting, no escaping arguments, one character between fields. Every database has a fast path for it:

psql -c "\copy accounts FROM 'sample-toolexe.tsv' WITH (FORMAT text, HEADER true)"
mysql -e "LOAD DATA LOCAL INFILE 'sample-toolexe.tsv' INTO TABLE accounts
FIELDS TERMINATED BY '\t' IGNORE 1 LINES"
sqlite3 app.db ".mode tabs" ".import --skip 1 sample-toolexe.tsv accounts"

For a spreadsheet, copy is faster than download. Excel and Google Sheets both split pasted text on tabs with no import dialog at all. A saved file is different: Excel reads a .tsv file as the system code page unless the bytes start with a UTF-8 marker, so accented names arrive mangled. Tick the BOM box before downloading when the file is headed for Excel, and leave it off for anything else, since a stray marker on the first header cell breaks string comparisons in scripts.

Generated rows are not a substitute for a sample of the real thing. Production data carries duplicate keys, values nobody documented, and formats that predate the current schema. Use this page for the shapes you already understand and for the defects you want to prove against. Also worth stating plainly: never copy live customer records into a shared test fixture. Generated rows exist so nobody has a reason to.

Where this page stops

Nearby pages

Commas instead of tabs, with quoting handled, comes from the random CSV generator. Once you have a table, TSV to JSON turns the rows into records for an API fixture, TSV to CSV quotes the values that need it, and TSV to Base64 packs the file into a string for a config value or a test payload.

Questions that come up while building a fixture

What people ask after the first file lands in a test suite.

Will the same seed give me the same file next month?

Yes, as long as the columns, their order, their types, the row count, and the edge toggles match. All of those feed the same generator in the same sequence. Rename a column and the values stay put, since header text is written straight to the file. Add or remove a column and every later value shifts, because the draw order changed.

Why does adding one column change values in the other columns?

Values are drawn from a single stream of numbers, one draw after another, left to right and top to bottom. Inserting a column consumes a draw that used to belong to the next field, so everything after that point moves. Keep the column list stable when you want a fixture to stay fixed.

Is a value with a tab inside actually valid TSV?

No, and that is why the toggle is there. The IANA registration for text/tab-separated-values has no escaping rule, so a tab inside a field is unrepresentable. Real files carry them anyway, usually from a paste into a spreadsheet cell. Your parser needs a decision for that case, and the toggle is how you find out what the decision currently is.

How do I tell an empty cell from a missing one?

In TSV you cannot, and no convention settles it. Two adjacent tabs mean the field is empty and nothing more. If your schema needs null and empty string to differ, the format has to carry a marker for one of them, or you move to JSON, where the distinction exists.

Can I control how many rows carry each defect?

Not per toggle. Each defect lands in roughly one row in six, and ragged rows in about one in twelve, which keeps a small sample from turning into pure noise. For a file that is broken in a specific row, generate a clean one, then edit that row by hand.

Do the accented names test my database properly?

They cover encoding and display, which catches most problems. They will not test collation edge cases such as whether your database sorts a Turkish dotless i correctly, or whether a unique index treats two normalisation forms of the same name as one value. Those need characters chosen for the specific rule you are checking.

Should the download include the UTF-8 BOM?

Only for Excel. Without it, Excel reads the file as the system code page and mangles anything outside ASCII. Everywhere else the marker is a nuisance, because it lands on the first header cell and makes a string comparison against that header name fail for reasons nobody sees in the terminal.

Is any of this sent to a server?

No. The generator, the preview, and the file download all run in JavaScript in this tab, and nothing is stored. Closing the page loses everything except the seed, which is the only thing you need to rebuild the file.