CSV PII redactor

Mask, salted-hash, or redact the values in the CSV columns you choose — for safe sharing. Runs entirely in your browser, nothing is uploaded.

Try:
Redacted CSV

About this tool

CSV PII redactor de-identifies the values in the CSV columns you choose — so you can share a spreadsheet without leaking emails, phone numbers, card numbers, IDs, or other personal data. Pick the columns (everything else passes through untouched) and one of three deterministic modes:

Worked example

Input CSV (redact the email column, mode mask):

name,email
Ada,[email protected]
Bob,[email protected]

Output:

name,email
Ada,***************
Bob,***********

The name column and the header row are unchanged; only email's data cells are masked.

Privacy

Everything runs in your browser via WebAssembly — your CSV is never uploaded. Also available from the gizza CLI and in chat.

Columns by name or index

With First row is a header ticked, name columns directly (email,card). Untick it to address columns by 1-based index (2,3). Only the columns you list change; the rest — and the header row — are copied through verbatim. Works with , / tab / ; / | delimiters (the same delimiter is used for reading and writing).

FAQ

Is the hash reversible? What does the salt do?

No — SHA-256 is one-way, so a hashed value can't be turned back into the original. But short, predictable values (a small set of IDs, common email addresses) can be guessed by hashing every candidate and matching — a "rainbow table" attack. Adding a salt that only you know defeats that: an attacker would have to know your salt to build a matching table. The trade-off you keep is linkability — the same value plus the same salt always yields the same code, so hashed columns still join across rows and files. Use the same salt everywhere you want values to line up; change it to break the link.

Can I keep part of a value visible, like the last 4 digits of a card?

Yes. In mask mode set Keep last N to the number of trailing characters to leave readable. 4 turns 4111111111111111 into ************1111. If N is greater than or equal to the value's length, nothing is masked (the whole value stays visible), so keep N small relative to your data.

My file has no header row — can I still pick columns?

Yes. Untick First row is a header and address columns by 1-based position instead: 2 is the second column. With a header present, each entry is matched against the header names first and only treated as a number if no name matches. An index outside the file's width (e.g. 9 in a 3-column file) is rejected with an out-of-range error.

How is this different from the free-text PII tools?

The redact-pii and pii-tokenize tools scan free prose and detect PII by pattern (emails, phones, SSNs) anywhere in the text. This tool is column-scoped: you say exactly which CSV columns to change and it never touches the others, which is what you want for tabular exports. It also adds a salted-hash mode that those text tools don't have. To simply drop columns instead of redacting them, use csv-reorder-columns.

Can I apply a different mode to each column in one pass?

Not in a single run — one mode applies to every column you list. To mix modes (say, hash the user ID but mask the card), run the tool once per group: first hash the ID column, then paste the result back and mask the card column. Each pass only rewrites the columns you name, so they compose cleanly.

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool csv-pii-redactor "name,email,card
Ada,[email protected],4111111111111111" 'columns=email,card'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/csv-pii-redactor/?data=name%2Cemail%2Ccard%0AAda%2Cada%40example.com%2C4111111111111111&columns=email%2Ccard&mode=mask&header=true&delimiter=%2C&mask_char=%2A&keep_last=0&salt=team-2026&hash_length=8&label=%5BREDACTED%5D