Data & Sheets tools

Forty-two tools for converting, comparing and cleaning table data: CSV, Excel, JSON, XML and YAML. Each one runs inside your browser, so the file never leaves your machine.

Asset Register & Maintenance Log

Track equipment, depreciation and what maintenance is due.

Email List Cleaner & Validator

Tidy a mailing list: syntax, duplicates, aliases, role and disposable addresses.

Contact Merger & Deduplicator

Merge contact exports and settle the duplicates field by field.

Address Parser & Formatter

Split messy one-line addresses into proper fields, then reformat them.

Guest List & RSVP Tracker

Track invitations, replies, headcount and meal choices in one list.

Inventory & Stock Count Sheet

Stock levels, reorder alerts and a count sheet that shows the variance.

Waiting List & Queue Tracker

Fair positions, offers recorded, and a wait estimate from real throughput.

CSV to JSON

Convert CSV or TSV to JSON, and JSON back to CSV.

Excel Converter

XLSX to CSV, JSON or the other way round.

CSV Viewer & Editor

Open a big CSV, sort, filter and edit it in a table.

Deduplicate & Merge

Remove duplicate rows or merge several CSV files.

CSV Splitter

Break a huge CSV into smaller files by row count.

YAML / XML / JSON

Convert freely between YAML, XML and JSON.

Chart Maker

Paste data, get a chart, download it as PNG.

CSV Merge

Join two CSV files on a shared column.

CSV Compare

See what changed between two versions of a file.

Pivot Table Maker

Group and summarise data like a pivot table.

Statistics Calculator

Mean, median, spread, quartiles and outliers.

Table Converter

Convert tables between CSV, Markdown, HTML and JSON.

Fixed Width Converter

Turn aligned text columns into proper CSV.

SQL on a CSV

Run SELECT queries against a CSV file.

CSV to Contacts

Turn a spreadsheet into a vCard contacts file.

CSV to Calendar

Turn a list of events into an importable calendar file.

Map Data Viewer

View and convert GeoJSON, GPX, KML and coordinates.

Data Anonymiser

Replace personal details with realistic fake ones.

Sample Data Generator

Make test rows as CSV, JSON or SQL.

Data Extractor

Pull emails, links and numbers out of text.

vCard to CSV

.vcf contacts to a spreadsheet.

Calendar File Viewer

Read .ics files; export events to CSV.

Bulk QR Generator

A CSV in, a sheet of QR codes out.

Markdown Table Editor

Edit Markdown tables in a real grid.

CSV Data Profiler

Column types, missing values and data quality checks.

ID & Check Digit Validator

Check IBAN, ISBN, EAN, VIN, IMEI and card numbers in bulk.

Nested JSON Flattener

Flatten nested JSON into CSV columns, and put it back.

Weighted Decision Matrix

Score options against weighted criteria and rank them.

Mail Merge

Merge a CSV into a letter, email or certificate template.

Fuzzy Match & Join

Join two lists that share no exact key, with a score per pair.

Broken CSV Repair

Diagnose and fix a CSV that will not open properly.

Unpivot & Reshape

Turn wide columns into tidy rows, and back again.

CSV to SQL Script

Generate CREATE TABLE and INSERT statements from a CSV.

Time Series Resampler

Resample timestamped rows onto a regular interval.

Bank CSV to QIF

Convert a bank or card CSV export into a QIF file.

What these tools are for

Most of this category exists to move a table from one shape into another. Table Converter and the YAML / XML / JSON tool swap between formats. Nested JSON Flattener turns an API response full of objects inside objects into plain rows and columns. CSV to SQL Script writes the insert statements for you. vCard to CSV and CSV to Contacts cover the awkward gap between address books and spreadsheets.

The rest is clean-up and comparison. CSV Compare shows what changed between two exports. Fuzzy Match & Join lines up two lists that nearly agree. Data Anonymiser is for removing identifying details before you send a sample to someone. Address Parser & Formatter splits one long address field into parts. A few are small record keepers rather than converters, such as Asset Register & Maintenance Log and Waiting List & Queue Tracker.

What changes when the work happens locally

Spreadsheets tend to be the most sensitive files an office holds: customer lists, payroll, bookings, supplier prices. The sticking point with an online converter is rarely the conversion. It is the upload. Here the page reads the file straight from your disk, so there is no upload step at all, and no queue behind it. Once the page has loaded, the tools keep working with the network off.

The trade-off is genuine. Your browser tab holds the whole table in memory, so the practical size limit is your own machine rather than someone's server plan. A very large file feels slow on an old laptop and fine on a new one. There is also no automation. Nothing runs on a schedule and there is no API to call, so each job is one you do by hand.

Choosing a tool, and what to check first

Start by naming the job. If you are changing shape, reach for Table Converter or Nested JSON Flattener. If you want to know what differs between two files, use CSV Compare. If two lists should agree but the keys are typed slightly differently, Fuzzy Match & Join is the one. If you simply want to see the rows and fix a few by hand, open CSV Viewer & Editor or the Markdown Table Editor.

The common problem is usually not the tool. It is the CSV. Fields containing commas, stray quotes, mixed date formats and trailing spaces all come out of ordinary spreadsheet exports, and they break joins quietly rather than loudly. Scan a few rows before you convert anything. With fuzzy matching, read the matches it proposes instead of trusting them. Keep the original file untouched so you can start again.

Before you see a table: what the shared CSV parser has already decided

Thirty-eight of the forty-two tools here have no CSV reader of their own. They share one file, assets/js/csv.js, so the awkward guesses are made once instead of forty-two times. The first guess is the separator. It reads the first line and counts commas, semicolons, tabs and pipes, but only the ones sitting outside quotes. Count them all and a quoted address with a comma in it would out-vote the semicolons in a European export. Whichever character wins is used, and a first line with none of them is read as comma separated.

The header row gets the second guess. Blank and repeated names are renamed, never merged. A blank third header becomes column 3, and a second Name becomes Name (2). Merging them would drop a column without a word, and a missing column is very hard to spot an hour later. Numbers get the third guess. A value only becomes a number when the number prints back as the same text, so 007 stays the text 007. That single rule is why postcodes, phone numbers and account numbers come through a conversion intact.

Writing is stricter than reading. Lines go out ending in a carriage return and a line feed, which is what RFC 4180 asks for. Reading accepts that, plain line feeds, and the bare carriage returns still found in very old Mac files. A field is wrapped in quotes if it holds the separator, a quote, a line break, or a space at either end that a reimport would otherwise eat. The parser is also not a streaming one, and that is on purpose: the file arrives as a single string in memory, which is easy to check line by line and is the real reason there is a size ceiling.

An .xlsx is a zip full of XML, which is why a browser can open one

Excel Converter is not sending your workbook off to be converted, and it does not need to. A file ending .xlsx is a ZIP archive holding XML. One part describes the workbook, one holds every distinct piece of text in it, and there is one more for each sheet. Reading is unzip, read the text table, walk the cells. Writing is that in reverse: the converter builds the smallest set of parts Excel will accept and stores them without compression, which a ZIP is allowed to do and which keeps the writer short enough to read through.

The same design explains what does not survive the trip. The converter reads cell values and never opens the styling part of the file, so a date arrives as the number Excel keeps underneath it. A cell holding a formula hands over the value Excel last saved there, not the formula. Going the other way, the file it writes carries values only: no formulas, no number formats, no column widths, no colours. Sheet names are cut to 31 characters. Ask for every sheet at once and you get one CSV per sheet inside a ZIP, each with a byte order mark on the front, because without those three bytes Excel reads a UTF-8 CSV in the local codepage and every accented letter turns to rubbish.

One file type is turned away at the door. The old .xls from before 2007 is a binary format with nothing in common with .xlsx, so the page stops and asks you to open it in Excel and save it again. Handling it would mean carrying a second, larger parser for a format that was replaced in 2007.

Money, blanks and near-matches: three places the arithmetic is done the slow way

Bank CSV to QIF holds every amount as a whole number of pence, paise or cents, read off the digits in the text rather than obtained by multiplying a decimal. 0.1 has no exact form in binary floating point, so a few hundred amounts added that way drift, and a balance check that is out by a penny it invented itself is worse than no check at all. Whole numbers add exactly, so the total either matches the statement or it does not. The same tool settles the decimal separator once for the whole column instead of row by row, because 1,234 is one thousand in one country and one and a bit in another, and only the column around it can decide which.

CSV Data Profiler measures on the values that are actually present. A mean over 900 numbers and 100 blanks is the mean of 900 numbers; scoring the blanks as zero would drag it down and say nothing. It also names a column by its dominant type rather than insisting every cell agree. Five thousand whole numbers with one cell reading N/A is an integer column with one problem in it, not a text column, and the count of values that break the type is the number you were looking for.

Fuzzy Match & Join is the one with hard ceilings, and they are arithmetic as well. Two lists of three thousand rows are nine million comparisons, and one comparison timed at roughly a microsecond in Chromium. So it takes at most 20,000 rows per list, looks at the first 200 characters of a value, and compares every possible pair only while there are 60,000 or fewer of them. Past that it indexes the second list by the three-letter runs inside its words, spends the rare runs first, and scores only the rows that share the most of them. That is a shortcut rather than a full sweep, and the results line says which of the two you got.