CSV & Excel Data Cleaner with Change Log avatar

CSV & Excel Data Cleaner with Change Log

Pricing

from $2.00 / 1,000 input rows

Go to Apify Store
CSV & Excel Data Cleaner with Change Log

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

Aidan McCollum

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Categories

Security

Limited permissions

Share

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 typeWhat happensExample
EmailTrimmed, lowercasedMARIA.KOWALSKI249@EXAMPLE.COM → maria.kowalski249@example.com
Phone (any country)Validated and formatted13743111047 → (374) 311-1047
DateISO YYYY-MM-DD, with day-first or month-first decided per column05/03/19 → 2019-05-03
Money and numbersCurrency text to numbers1,419 USD → 1419.00
NamesEncoding repaired, Last, First reordered, case fixedO'Brien, Linda → Linda O'Brien
US statesTwo-letter codesWashington → WA
Null markersn/a, none, - and similar become emptyn/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

  1. Give it a file URL (CSV, XLSX or JSON), or the dataset ID of another Actor's run to clean scraped data.
  2. Optionally, choose the columns that identify a record, the required columns, and your phone region.
  3. 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.

RowsCost
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

WhereKeyContents
DatasetOne clean record per row, with _source_rows and _flags
Key-value storeclean.csvThe clean records as a CSV file
changesEach changed value: row, column, before, after, rule
reviewRows held back, with the reason
columnsDetected type of each column and the evidence
clustersValues that look like variants of each other (likely typos)
schemaA JSON Schema for the clean records
recipeSettings to repeat this exact clean
statsThe 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

Questions or a custom need: patchwell.support@gmail.com