CSV & Excel Data Cleaner with Change Log
Pricing
from $2.00 / 1,000 input rows
CSV & Excel Data Cleaner with Change Log
Clean a CSV, Excel or JSON file, or any Apify dataset. Detects column types, standardizes dates, phones, names and money, merges duplicates, and logs each changed value. Save the recipe to clean next month's file the same way. $2 per 1,000 rows.
Pricing
from $2.00 / 1,000 input rows
Rating
0.0
(0)
Developer
Aidan McCollum
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Security
Limited permissionsShare
Clean a messy CSV, Excel or JSON file, or the output of any Apify Actor. You get typed, deduplicated records and a log of each value it changed. The cleaner reads each column's values to work out what the column holds, fixes formats, and merges duplicate records. When it holds a row back, it tells you which row and why.
What it fixes
| Column type | What happens | Example |
|---|---|---|
| Trimmed, lowercased | MARIA.KOWALSKI249@EXAMPLE.COM → maria.kowalski249@example.com | |
| Phone (any country) | Validated and formatted | 13743111047 → (374) 311-1047 |
| Date | ISO YYYY-MM-DD, with day-first or month-first decided per column | 05/03/19 → 2019-05-03 |
| Money and numbers | Currency text to numbers | 1,419 USD → 1419.00 |
| Names | Encoding repaired, Last, First reordered, case fixed | O'Brien, Linda → Linda O'Brien |
| US states | Two-letter codes | Washington → WA |
| Null markers | n/a, none, - and similar become empty | n/a → empty |
The cleaner repairs broken accents from wrong encodings (Linda MartÃnez → Linda Martínez) in every text column. It empties values that can't be valid, like the email not-an-email or the state Narnia, and lists each one in that record's _flags.
How it decides dates
05/03/19 can mean May 3 or March 5. The cleaner counts the values in that column that parse only one way and picks the order they support. It saves the decision and the count in columns, for example: "87 values only valid month-first vs 0 day-first".
Duplicates merge into one record
Rows that describe the same record (same email by default, or the columns you choose) become one record, with gaps filled from each copy. When two copies disagree on a value, the cleaner keeps the first one and adds an entry to the review list with the rows and every value they held, so you can decide. Each clean record lists the original rows it came from in _source_rows.
Every row is accounted for
The counts always add up: input rows = blank rows + rows sent to review + clean records + merged duplicates. If they don't, the run fails. Rows missing a required column go to a review list with the reason.
Clean next month's file the same way
Each run saves a recipe: the column types, date order and phone settings it used. Paste it into Recipe from an earlier run, and the cleaner applies the same rules to the next file, even when that file's values are ambiguous on their own.
How to use it
- Give it a file URL (CSV, XLSX or JSON), or the dataset ID of another Actor's run to clean scraped data.
- Optionally, choose the columns that identify a record, the required columns, and your phone region.
- Click Start. Clean records appear in the Output tab. The key-value store holds
clean.csv, the change log, the review list and the recipe.
How much does data cleaning cost?
$2.00 per 1,000 input rows ($0.002 per row). Files it can't read cost nothing.
| Rows | Cost |
|---|---|
| 352 (the sample file) | $0.70 |
| 10,000 | $20.00 |
| 100,000 | $200.00 |
Example
Input, using the sample prefilled in the form: 352 rows of customer records with mixed date formats, broken encodings, duplicate customers and currency strings.
{ "url": "https://patchwell.io/samples/customers_messy.csv" }
The run took 2.2 seconds and returned 301 clean records. It merged 45 duplicates, removed 6 blank rows and fixed 1,435 values, logging each one. A clean record:
{"Customer Name": "Renée Lee","E-mail": "rene.lee101@example.com","Phone #": "(374) 311-1047","State": "CO","Signup Date": "2019-05-03","Total Spend": 1418.84,"_source_rows": [2, 21],"_flags": []}
Entries from the change log (changes in the key-value store):
[{ "row": 2, "column": "Phone #", "before": "13743111047", "after": "(374) 311-1047", "rule": "valid number, national format" },{ "row": 2, "column": "Signup Date", "before": "05/03/19", "after": "2019-05-03", "rule": "ISO date YYYY-MM-DD (MDY)" },{ "row": 4, "column": "Customer Name", "before": "O'Brien, Linda", "after": "Linda O'Brien", "rule": "trim, fix encoding, Last, First -> First Last, case" }]
What each run saves
| Where | Key | Contents |
|---|---|---|
| Dataset | One clean record per row, with _source_rows and _flags | |
| Key-value store | clean.csv | The clean records as a CSV file |
changes | Each changed value: row, column, before, after, rule | |
review | Rows held back, with the reason | |
columns | Detected type of each column and the evidence | |
clusters | Values that look like variants of each other (likely typos) | |
schema | A JSON Schema for the clean records | |
recipe | Settings to repeat this exact clean | |
stats | The row accounting |
Use it from an AI agent
Add this Actor to Claude, Cursor or any MCP client through Apify's MCP server. Your agent can read the change log and check the fixes before it acts on the data.
FAQ
What about scraped data with nested fields?
Nested objects become columns with dotted names (address.city, address.zip). Lists stay as JSON text, so you lose nothing.
Does it verify that emails or phone numbers exist?
No. It checks emails for format and validates phone numbers against their country's numbering rules. It doesn't contact anyone.
How large a file can it handle?
Files up to 100 MB, or 200,000 dataset items. For larger jobs, write to patchwell.support@gmail.com.
Is my data stored?
The Actor processes files in a temporary container and discards them. Patchwell keeps no copies. Results stay in your own Apify storage.
Other Patchwell tools
- AI Web Research with Cited Sources: answers where each sentence cites its source page.
- Audio & Video Transcriber: word-level timestamps, SRT and VTT for audio and video links.
Questions or a custom need: patchwell.support@gmail.com