Define up to 100 columns, choose a field type for each, set a row count from 1 to 1,000,000 and a seed. The same seed and column settings always produce the same rows, in every browser, so a test file can be recreated instead of stored. Names, emails and phone numbers are fictional: emails end in @example.test, English phone numbers use the 555 range. Generation runs in your browser; nothing is uploaded.
How to generate a CSV file
- Set the number of rows (1 to 1,000,000) and a seed. The starting setup has six columns: a sequential
id, a full name, an email, a signup date in 2024–2025, a plan chosen as Free, Pro or Team in a 6:3:1 ratio, and an amount from 0 to 500 with two decimals. - Add, remove or rename columns and pick a field type for each. Every column name must be filled in and unique.
- Optionally set a share of blank cells or require unique values per column, then generate and download the file.
Rows are written in a background worker in parts rather than as one huge string, so a million-row file does not freeze the page, and cancelling stops the job. One output file is capped at 4 GB.
Field types
| Sequence | Counts from a start value (default 1) by a step (default 1). An optional padding width writes 000001-style IDs; negative numbers are never padded. |
|---|---|
| UUID | Version-4 layout from RFC 9562 (xxxxxxxx-xxxx-4xxx-[89ab]xxx-…), drawn from the seeded generator. Reproducible, so not suitable as a secret or security token. |
| First name, last name, full name | Common names for the interface language. Chinese, Japanese and Korean full names are written family name first without a space. |
name.word<row>@example.test, for example casey.maple1@example.test. The row number makes each address unique. It is not derived from the name column. | |
| Phone | A pattern where each # becomes a digit. Leave it empty for the language default; in English that is +1 555-###-####. |
| Company, city, country | Invented company names and real city names for the interface language; country picks from a fixed list of 20. |
| Integer | A whole number between the minimum and maximum, both included. Both bounds are required and must stay within ±9,007,199,254,740,991, the largest whole numbers JavaScript stores exactly. |
| Decimal | A number between the minimum and maximum with 0 to 10 decimal places, for example 114.71. |
| Boolean | true or false with equal probability. |
| Date, date-time | A random day between two YYYY-MM-DD dates, both included. Date-time adds a random UTC time: 2026-01-04T09:17:35Z. |
| Choice | One value per line, with an optional weight after a colon: Free:6, Pro:3, Team:1 picks Free about 60% of the time. Lines without a weight count as 1. |
| Pattern | A template where # is a digit, ? an uppercase letter and * a digit or uppercase letter: SKU-####-?? gives SKU-6836-LU. All other characters are copied. |
| Words | 1 to 20 words (default 3) from a fixed list of 20 plain English words, for filler text. |
| Constant | The same text in every row. |
Seeds and reproducibility
The seed is any text. Each column draws from its own random stream derived from the seed and the column name, so:
- the same seed, row count and column settings give a byte-for-byte identical file every time, in every browser;
- adding, removing or reordering other columns does not change a column’s values, but renaming a column changes them;
- asking for more rows keeps the earlier rows unchanged and appends new ones;
- the interface language changes names, cities, companies and the default phone format, not numbers, dates, choices or emails.
Blank cells use a separate stream. A blank cell does not consume a value, so changing the blank percentage shifts which values appear in the later rows of that column.
Blank cells and unique values
Blank cells is a percentage from 0 to 100 per column; each cell is left empty with that probability. Use it to test how an import handles missing values.
Unique values redraws a value until it has not been used in that column, and gives up after 1,000 tries with an error naming the column. The settings are rejected up front when uniqueness is impossible: an integer range with fewer whole numbers than rows, or fewer choices than rows. Other types can still run out partway, for example a unique full name after about 144 rows in English (12 first names × 12 last names). Sequence, UUID and constant columns skip the check, and blank cells are not counted as values.
Settings errors
- Row count must be a whole number from 1 to 1,000,000, and there must be 1 to 100 columns.
- A column name is empty or used twice: every header must be filled in and different.
- Integer and decimal columns need both a minimum and a maximum, with the minimum not above the maximum.
- Date ranges must be written
YYYY-MM-DD, such as2024-01-01;2024/01/01or01/02/2024is rejected. - A pattern must contain at least one
#,?or*; otherwise use a constant column. - A choice list needs at least one value with a weight above zero.
Example
Five rows with the seed demo-2026: a sequence starting at 1001 padded to 6 digits, a full name, an email, a weighted choice, a decimal from 0 to 250 with 40% blank cells, and the pattern SKU-####-??. Run it again with the same settings and you get exactly these rows. Line endings are shown as plain line breaks.
rows: 5 seed: demo-2026 language: English customer_id sequence start 1001, width 6 name full name email email plan choice Free:6 / Pro:3 / Team:1 mrr decimal 0–250, 2 places, 40% blank sku pattern SKU-####-??
customer_id,name,email,plan,mrr,sku 001001,Mary Brown,casey.maple1@example.test,Free,,SKU-6836-LU 001002,Ethan Davis,taylor.copper2@example.test,Pro,,SKU-8060-HR 001003,Ethan Clark,morgan.falcon3@example.test,Team,114.71,SKU-1401-TZ 001004,Olivia Davis,jordan.harbor4@example.test,Pro,91.82,SKU-8840-PT 001005,Mia Taylor,casey.prism5@example.test,Free,6.99,SKU-6878-OZ
Questions and answers
Is the generated data safe to share?
It contains no real people: names are random pairs of common names, emails use the reserved .test domain (RFC 2606) and English phone numbers use 555. City names are real places.
Will a colleague get the same file?
Yes, if they use the same seed, row count, interface language and column settings, including column names. The generator uses its own seeded algorithm rather than the browser’s random numbers.
Do I need a large file or a small fixture?
For a few documented rows with known edge cases, use the sample CSV files. Use the generator when you need volume, your own column names or a specific mix of types.