CSV Column Masker

[ MASKED CSV ]
employee_id,name,email,phone,branch,salary E-1001,J*** C***,#########@acme.ph,#######1234,Cebu,45000 E-1002,A** R****,#########@acme.ph,#######4567,Davao,52000 E-1003,M*** S*****,###########@acme.ph,#######2222,Cebu,38500
3 rows · 3 columns masked
Rows3
Columns6
Masked3
Columns to mask
[ WHAT WAS MASKED ]
nameKeep the initials3 cells · 3 distinct
emailKeep the email domain3 cells · 3 distinct
phoneKeep the last four3 cells · 3 distinct
Masking a column is not anonymisation. A masked name beside a job title, a branch and a start date still identifies one person, and a rare value — an unusual surname, the only row from one office — is identifiable from its shape alone. Read the output before you send it.
[ WHAT THIS IS ]

Most people do this in Excel, and Excel is where it goes wrong. A spreadsheet of employees or customers has to go to a vendor, so somebody selects the email column and types over it. What gets missed is never the column they were looking at.

The shape is usually the point. An email masked to [email protected] is still shaped like an email, so it still passes the import the vendor is testing. [REDACTED] does not.

But the stable pseudonym is the one style here that survives a join. Mask a customer id to ##### and every row looks identical, taking the count of repeat customers with it. A pseudonym derived from the value stays the same for the same id, so the shape of the data survives even though the value does not.

And one warning matters more than it looks: the row with the wrong number of fields. A comma inside an unquoted address shifts every later field one place along — so the value you asked to mask is now in the next column, which nobody masked, and the file that comes out still looks clean.

[ QUESTIONS ]

Is my spreadsheet uploaded anywhere?

No. There is no upload and no file picker — you paste the rows in and the masking happens in your browser, in this site’s own calculation engine. Nothing is transmitted, logged or stored, which matters more here than on any other page: what people paste into this tool is a staff list or a customer export.

Why paste instead of choosing a file?

Because a file picker would add nothing and cost something. Reading a file is asynchronous and holds the whole spreadsheet in memory, and the result is the same rows you can select and copy out of Excel in two keystrokes. Pasting keeps the tool instant on a phone and keeps the promise simple: the data goes into a text box on a page, and the page does not talk to anything.

What does “keep the shape” actually keep?

Digits become #, letters become x, and everything else — the @, the dots, the hyphens, the spaces — stays. So an email still looks like an email and a nine-digit reference still has nine digits. That is usually what makes a masked file still usable for testing an import, because the column still validates.

What is the stable pseudonym for?

For when equal values have to stay equal. Masking a customer id to ##### makes every row look the same and destroys any count of repeat customers; replacing it with a pseudonym derived from the value keeps all of that, because the same id always produces the same token. It is the only style here that survives a join.

Can a pseudonym be turned back into the original?

Unsalted, yes — for anything from a small set. A pseudonym is a hash, and there are only ten billion Philippine mobile numbers, so a laptop tries all of them and matches every token in minutes. Put anything in the salt field and that stops working, at the cost of the tokens being different next time unless you use the same salt again. The page says which of the two it just did.

Why does it warn about rows with the wrong number of fields?

Because that is how the masking silently fails. A comma inside an unquoted address shifts every later field one place along, so the value you asked to mask is now sitting in the next column — which nobody masked — and the file that comes out still looks clean. Every such row is listed by number so you can fix the quoting before the file goes anywhere.

Does this anonymise the file?

No, and this is the limit worth reading twice. Masking a column removes one identifier, not identity. A masked name beside a job title, a branch and a start date still describes one person, and so does a rare value — an unusual surname, the only row from a small office — even after the letters are replaced. Read the output before you send it.

Why is the header row left alone?

Because a file whose columns are called xxxx is not anonymous, it is unusable — and somebody who cannot use it sends the original instead. The header names the columns; it does not contain anybody’s data.

[ THE MATHS ]
What each style keeps
Keep the shapelength and punctuation
Stable pseudonymequality
Last foursupport matching
Initialsword count
Email domainthe company
Empty the cellnothing
[ WHY THE PSEUDONYM IS 12 HEX ]

Twelve hex characters is 48 bits. The birthday bound puts an even chance of one collision at around 17 million distinct values. Six hex — what a token looks like in most tools — collides at about four thousand, which a staff list reaches. A collision here silently merges two people into one group.

[ NEXT ]
55Text RedactorThe same idea, for prose rather than a table
63JSON ⇄ CSV ConverterIf the export came out as JSON
60Hash GeneratorThe hash the pseudonym is built from
54Text ExtractorTo find what a column actually contains
[ IMPORTANT ]

Nothing you paste is transmitted or stored. Masking a column is not anonymisation — a masked name beside a job title, a branch and a start date still identifies one person, and an unsalted pseudonym can be reversed for any value from a small set. Read the output before you send it. Nothing you type here is sent to our servers — the calculation runs entirely in your browser.