Data migrator
Your messy Excel file turns into a clean list, ready to move into your system.
Live. Runs in your browser.
What your client sees
- The problem it solves
- Moving clients or orders from a spreadsheet into a new system is usually manual work: dates written a dozen ways, phone numbers without a country code, typos in emails and duplicate rows.
- A real-life example
- Picture a hardware store switching to new billing software. It exports its client list, runs it through the migrator and gets a clean list to import, plus another with the rows to check.
- What you'll see
- You upload a file, or use the sample one, and right away you see what was fixed, how many rows came out fine and what to check in each of the others, with a before and after.
Under the hood
What it does, in technical terms
Upload a messy CSV or Excel file and watch how columns are detected, dates, phone numbers and emails are normalized, and valid rows are separated from those with errors.
- Technologies
- TypeScript
- PapaParse
- Zod
- Python
- FastAPI
- python-calamine
- charset-normalizer
Architecture
1.Your browser (TypeScript)
PapaParse reads the CSV, each column's type is detected, every value is normalized and Zod validates each row. By default the file never leaves your device.
2.Python engine (FastAPI on Render)
Optional: it reads Excel (.xlsx and .xls), detects the encoding and accepts larger files. It processes in memory and saves nothing.
3.One contract
The shape of the result is defined in Zod, exported to JSON Schema, and the Python tests validate every response against it.
4.Parity test
With every change it compares the Python output with the browser's on the same files.
By the numbers
- engines with the same rules, in the browser and in Python
- 2
- per file at most, on the Python engine
- 10 MB
- rows per file at most, on the Python engine
- 50,000
The code
Decisions
- DEC-022: Data migrator in Python (FastAPI) on Render (opens in a new tab)
- DEC-028: The order of numeric dates (opens in a new tab)
Recorded in docs/DECISIONES.md (in Spanish), with their context and the alternatives ruled out.
Try it with a customer list
- Upload your file. in progress.
- It sorts itself out. pending.
- Check the result. pending.
- Download your clean list. pending.
A CSV or Excel file with your data, or try the sample file.
Drop your customer list here
A CSV exported from your current software or your spreadsheet. It's sorted out right here: your file never leaves your device.
sample-customers.csv: 37 rows, the way they come out of an old system.
Upload your file
Up to 5 MB and 20,000 rows, separated by commas or semicolons, with the column names in the first row.
See what the sample file looks like
Nombre completo ;Correo Electrónico;Teléfono;Fecha de registro;Monto (COP);Ciudad ana maría GÓMEZ ;[email protected] ;300 555 0101;03/04/2024;$1.200.000,50;bogotá CARLOS andrés ruiz;[email protected];+57 (310) 555-0102;2024-04-05;1200000.5;Medellín luisa fernanda díaz; [email protected];3125550103;3 de abril de 2024;850.000;cali josé del carmen pérez;[email protected];(+57) 315 555 0104;15/01/2023;$ 2.500.000;SANTA MARTA María de los Ángeles Torres;[email protected];320-555-0105;7 abr 2024;350000;Barranquilla pedro salazar;pedro.salazar@example;301 555 0106;12/05/2024;$780.000;Pereira ana maría gómez;[email protected];+57 300 555 0101;2024-04-03;1200000.5;Bogotá marta ríos;marta.rios.example.com;311 555 0107;20/06/2024;95.000;Bucaramanga Jorge Iván Restrepo;[email protected];555 0108;01/07/2024;1.500.000;Manizales ;;;;; Sofía Martínez;[email protected];3165550109;31/02/2024;420000;Cartagena andrés felipe castro;[email protected];3175550110;04/13/2024;$ 1.050.000;Cúcuta Valentina Rojas;[email protected];318 555 0111;2024-08-19;mil doscientos;Ibagué CARLOS andrés ruiz;[email protected];+57 (310) 555-0102;2024-04-05;1200000.5;Medellín daniela herrera;[email protected];+57 300 555 01;10/09/2024;640.000,00;Villavicencio Camilo Andrés Vargas;camilo [email protected];3195550113;5 de octubre de 2024;2.000.000;Neiva ; ; ;;; natalia gómez;[email protected];3205550114;23/10/2024;$3.450.000;Pasto luis eduardo moreno;[email protected];300 555 0115;2024/11/02;150000.75;tunja paula andrea suárez;[email protected];3015550116;8 de noviembre de 2024;$ 980.500;Armenia luisa fernanda díaz;[email protected];+573125550103;03/04/2024;850000;Cali Ricardo Peña;[email protected];+1 (415) 555-0117;12/12/2024;USD 1,250.00;Miami Gabriela Ortiz;[email protected];+57 601 555 0118;14/02/2025;275.000;bogotá d.c. Esteban Quintero;[email protected];3105550119;;;Popayán martín alonso lópez;[email protected];3115550120;2 de enero de 2025;$1.2.3;Montería Laura Jiménez;laura.jimenez@exa mple.com;31255501;17/03/2025;560.000;Sincelejo Diego Fernando Ruiz;[email protected];3135550122;miércoles 9 de abril de 2025;1.000.000;Valledupar Isabella Cárdenas;[email protected];314 555 0123;22-04-2025;720000;Riohacha Mateo Sánchez;[email protected];315 555 0124;30/04/2025;$ 1.800.000,00;Quibdó Mariana Pineda;[email protected];3165550125;5/5/25;99.900;Florencia Sebastián Giraldo;[email protected];3175550126;2025-05-12;2.300.000;Yopal;VIP camila andrea mejía;[email protected];3185550127;3 jun 2025;$450.000;Leticia JUAN PABLO OSORIO;[email protected];319 555 0128;15.06.2025;1250000;Mocoa Lucía Fernández;[email protected];+57 320 555 0129;julio 1, 2025;$ 600.000;San Andrés Tomás Herrera;[email protected];0057 300 555 0130;20/07/2025;3.100.000,25;Arauca samuel ospina;[email protected];301-555-0131;2025-08-01;875000;Puerto Carreño
What will happen to your file
Five steps, in this order. Upload a file or try the sample to see what each one did.
Step 1: Read the file
PapaParse reads the CSV, detects whether the separator is a comma or a semicolon and takes the first row as headers.
Step 2: Detect columns
It turns the headers into names without accents or spaces and checks up to 200 values per column to tell whether each one holds email addresses, phone numbers, dates, amounts or text. For dates written with numbers (04/03/2024), it works out whether the month or the day comes first.
Step 3: Normalize
It removes extra spaces, writes names in title case and email addresses in lowercase, turns phone numbers into international format with Colombia's rules (10 digits starting with 3 are a Colombian mobile number and get +57; numbers from other countries need their + and country code), dates into year-month-day (month or day first, depending on the column) and amounts into numbers.
Step 4: Validate
It builds a Zod schema with the detected types and checks every row: a valid email address, an international phone number, a date that exists and a numeric amount. Empty cells are allowed.
Step 5: Result
It separates the valid rows from the ones with errors and counts the duplicates and empty rows that were left out.
Want it for your business?
This is part of what I build in the automations service. See what's included or get a reference estimate for your case.
Curious how it is built? Look under the hood
How it works
It has two engines with the same rules. By default everything happens in your browser (TypeScript): the file never leaves your device. If you choose the server, a Python API built with FastAPI receives the file, processes it in memory without saving it and returns the same result; it also reads Excel (.xlsx and .xls), detects the encoding of CSV files exported in Spanish and accepts larger files. An automated test compares both engines on the same files with every change.