Messy spreadsheet in, clean import file out: a before/after sample
This is a one-page sample of our spreadsheet cleanup: USD 40 per file, one file of up to 5,000 rows, cleaned the same business day with a change log. The input below is a fictional contacts file with typical problems: duplicates, mixed phone and date formats, names written as "Last, First", stray spaces, invalid emails, blank rows and inconsistent province values. The output is exactly what our cleaning script wrote. Nothing was edited by hand.
33 rows in, 27 rows out. Removed 2 blank rows and 4 duplicate rows. Flagged 3 rows for review; flagged rows stay in the file. Possible duplicates: 0 groups, not merged.
Before: the messy file (first 12 rows)
Source: messy_contacts.csv. Row numbers are the data rows in that file.
| Row | name | company | phone | province | signup_date | |
|---|---|---|---|---|---|---|
| 1 | Dana Whitfield | Brindle & Crane Bookkeeping | dana.whitfield@example.com | (416) 555-0148 | ON | 2026-03-14 |
| 2 | Priya Raman | Tamarack Forge Consulting | Priya.Raman@example.com | 416.555.0199 | Ontario | 03/14/2026 |
| 3 | Owen Bramwell | Lumen Parcel Works | owen.bramwell@example.org | +1 604 555 0141 | bc | Mar 5, 2026 |
| 4 | Okafor, Ruth | Sable Hollow Dental | ruth.okafor@example.com | 4165550123 | Ont. | 14 Mar 2026 |
| 5 | DEREK MOSS | Quillfeather Books Ltd | derek.moss@example.org | 905-555-0177 | ON | 2026/02/28 |
| 6 | Lindqvist, Ana | Northgate Ledger Co. | ana.lindqvist@example.com | (613) 555-0162 | Quebec | 31/12/2025 |
| 7 | jin-ho park | Harbour Ledger Services | jinho.park@example.org | 1-604-555-0190 | BC | 2026-01-09 |
| 8 | Marisol Tennant | Tennant Hospitality Group | marisol.tennant@example.com | 403 555 0136 | AB | 2026-02-02 |
| 9 | MARISOL TENNANT | Tennant Hospitality Group | MARISOL.TENNANT@EXAMPLE.COM | (403) 555-0136 | Alberta | 2026-02-02 |
| 10 | Sam Kowalczyk | Fernbank Plumbing | sam.k@example | 514-555-0118 | QC | 2026-04-21 |
| 11 | Tom Vidal | Vidal Trade Supply | tom.vidal@example.org | 555-0123 | ON | 2026-05-11 |
| 12 | Grace Ellery | Ellery Design Studio | grace.ellery@example.com | 613.555.0109 ext 4 | Ontario | 2026-06-30 |
After: the same records cleaned
Source: cleaned.csv, showing the same records. The From row column is added on this page for reference; it is not in cleaned.csv. Columns are as the script wrote them, including the added First Name and Last Name columns.
| From row | name | First Name | Last Name | company | phone | province | signup_date | |
|---|---|---|---|---|---|---|---|---|
| 1 | Dana Whitfield | Dana | Whitfield | Brindle & Crane Bookkeeping | dana.whitfield@example.com | (416) 555-0148 | ON | 2026-03-14 |
| 2 | Priya Raman | Priya | Raman | Tamarack Forge Consulting | priya.raman@example.com | (416) 555-0199 | ON | 2026-03-14 |
| 3 | Owen Bramwell | Owen | Bramwell | Lumen Parcel Works | owen.bramwell@example.org | (604) 555-0141 | BC | 2026-03-05 |
| 4 | Okafor, Ruth | Ruth | Okafor | Sable Hollow Dental | ruth.okafor@example.com | (416) 555-0123 | ON | 2026-03-14 |
| 5 | Derek Moss | Derek | Moss | Quillfeather Books Ltd | derek.moss@example.org | (905) 555-0177 | ON | 2026-02-28 |
| 6 | Lindqvist, Ana | Ana | Lindqvist | Northgate Ledger Co. | ana.lindqvist@example.com | (613) 555-0162 | QC | 2025-12-31 |
| 7 | Jin-Ho Park | Jin-Ho | Park | Harbour Ledger Services | jinho.park@example.org | (604) 555-0190 | BC | 2026-01-09 |
| 8 | Marisol Tennant | Marisol | Tennant | Tennant Hospitality Group | marisol.tennant@example.com | (403) 555-0136 | AB | 2026-02-02 |
| 10 | Sam Kowalczyk | Sam | Kowalczyk | Fernbank Plumbing | sam.k@example | (514) 555-0118 | QC | 2026-04-21 |
| 11 | Tom Vidal | Tom | Vidal | Vidal Trade Supply | tom.vidal@example.org | 555-0123 | ON | 2026-05-11 |
| 12 | Grace Ellery | Grace | Ellery | Ellery Design Studio | grace.ellery@example.com | (613) 555-0109 x4 | ON | 2026-06-30 |
Flagged for review (3 rows)
Source: flagged.csv. These rows are kept in the cleaned file so a person can check them. Nothing was deleted.
| Row | name | company | phone | province | signup_date | flags | |
|---|---|---|---|---|---|---|---|
| 10 | Sam Kowalczyk | Fernbank Plumbing | sam.k@example | (514) 555-0118 | QC | 2026-04-21 | invalid email |
| 11 | Tom Vidal | Vidal Trade Supply | tom.vidal@example.org | 555-0123 | ON | 2026-05-11 | short/invalid phone |
| 32 | Connor Reyes | Reyes Roofing | connor.reyes@example.com | 555.0175 | AB | sometime in 2025 | short/invalid phone; unreadable signup_date |
Removed as duplicates (4 rows)
Source: removed_duplicates.csv. Each removed row is listed with the row it duplicates. A row is an exact duplicate if every field matches; otherwise it is removed when its email matches an earlier row.
| Row | Duplicate of row | Duplicate type | name | company | phone | province | signup_date | |
|---|---|---|---|---|---|---|---|---|
| 9 | 8 | exact | Marisol Tennant | Tennant Hospitality Group | marisol.tennant@example.com | (403) 555-0136 | AB | 2026-02-02 |
| 17 | 16 | exact | Luca Bianchi | Bianchi Woodworks | luca.bianchi@example.com | (416) 555-0172 | ON | 2026-03-20 |
| 19 | 4 | same email | Ruth Okafor | Sable Hollow Dental | ruth.okafor@example.com | (416) 555-0123 | ON | 2026-03-14 |
| 25 | 24 | same email | Nadia Haddad | Haddad Tutoring Inc. | nadia.haddad@example.com | (514) 555-0111 | QC | 2026-08-14 |
Possible duplicates (0 groups)
No possible duplicates were found in this sample. The check looks for the same first name, last name and company with different email addresses.
Change log
Rendered from CHANGELOG.md, the file that comes with every cleaned file.
- Input: messy_contacts.csv: 33 rows x 6 columns
- Trimmed stray spaces in 10 cells
- Removed 2 completely empty rows (row 13, 20)
- email: lower-cased/normalised 3 emails
- phone: standardised 21 phone numbers to (###) ###-####
- signup_date: converted 10 dates to YYYY-MM-DD
- name: fixed capitalisation in 3 names
- Row 4 name: reordered 'Last, First' 'Okafor, Ruth' -> First 'Ruth', Last 'Okafor'
- Row 6 name: reordered 'Last, First' 'Lindqvist, Ana' -> First 'Ana', Last 'Lindqvist'
- Row 29 name: reordered 'Last, First' 'Wong, Eleanor' -> First 'Eleanor', Last 'Wong'
- Split 'name' into First Name / Last Name (3 'Last, First' names reordered; original column kept)
- Row 2 province: 'Ontario' -> 'ON'
- Row 3 province: 'bc' -> 'BC'
- Row 4 province: 'Ont.' -> 'ON'
- Row 6 province: 'Quebec' -> 'QC'
- Row 9 province: 'Alberta' -> 'AB'
- Row 12 province: 'Ontario' -> 'ON'
- Row 15 province: 'Ont' -> 'ON'
- Row 17 province: 'On' -> 'ON'
- Row 18 province: 'Ontario' -> 'ON'
- Row 22 province: 'bc' -> 'BC'
- Row 25 province: 'Quebec' -> 'QC'
- Row 26 province: 'British Columbia' -> 'BC'
- Row 27 province: 'Ontario' -> 'ON'
- Row 28 province: 'Ont.' -> 'ON'
- Row 31 province: 'ab' -> 'AB'
- province: normalised 15 region values to 2-letter codes
- Removed 4 duplicate rows (2 exact, 2 same 'email'); each is saved in removed_duplicates.csv, with the row it duplicates
- Row 9 removed: exact, duplicate of row 8
- Row 17 removed: exact, duplicate of row 16
- Row 19 removed: same email, duplicate of row 4
- Row 25 removed: same email, duplicate of row 24
- Possible duplicates: none found
- Flagged 3 rows for review (listed with the reason in flagged.csv; they remain in cleaned.csv); none deleted
- Rows: 33 in, 27 out (2 blank and 4 duplicate rows removed)
- Output: cleaned.csv: 27 rows, no flag column
- Delivery files: cleaned.csv, flagged.csv, possible_duplicates.csv, removed_duplicates.csv, CHANGELOG.md
Download the sample files
- Before: messy_contacts.csv (input)
- After: cleaned.csv
- flagged.csv (rows to review, with the reason)
- possible_duplicates.csv
- removed_duplicates.csv
- Change log: CHANGELOG.md
How it works
- Send us one file of up to 5,000 rows (contact details below).
- We confirm the scope with you.
- You receive the cleaned file and a change log the same business day.
- You review it, then pay USD 40 per file: pay USD 40 on Stripe.