Rename CSV columns with live preview
Rename CSV column headers in bulk, all in your browser with no upload. Edit names inline, run find-and-replace across headers (with an optional regex mode), or apply a naming convention such as snake_case, camelCase, PascalCase, kebab-case, or SCREAMING_SNAKE. Add a prefix or suffix, expand common abbreviations like dept to department, and use one-click presets for database, JavaScript, React, or CSS styles. A live preview shows changes before you apply them, and the data rows stay untouched.
Initializing in your browser…
A source export uses cryptic headers like `col_a` and your pipeline expects `customer_id`.
Mapping
col_a → customer_id · dt → signup_date · amt → total
Output
Header row rewritten; all data rows untouched
Only the header is rewritten via an explicit map, so downstream code that depends on exact column names works without you touching a single data cell. Bulk-renaming here is safer than a find-replace that might also hit values.
Rename CSV column headers in bulk, all in your browser with no upload. Edit names inline, run find-and-replace across headers (with an optional regex mode), or apply a naming convention such as snake_case, camelCase, PascalCase, kebab-case, or SCREAMING_SNAKE. Add a prefix or suffix, expand common abbreviations like dept to department, and use one-click presets for database, JavaScript, React, or CSS styles. A live preview shows changes before you apply them, and the data rows stay untouched.
The renamer parses your file in the browser with PapaParse (skipEmptyLines enabled) and treats the first parsed row as the header, building an editable list of original-to-new name pairs. It surfaces fatal Quotes/Delimiter errors as a blocking toast while letting FieldMismatch issues through as a warning, so a slightly ragged file still loads. Every transformation only rewrites that header row: when you Apply Renames the tool emits [newHeader, ...csvData.slice(1)], meaning all data rows and the original column order are preserved untouched, then re-serializes with Papa.unparse and downloads as {filename}_renamed.csv. A live preview marks exactly which columns will change before you commit.
The case-convention engine works by tokenizing each header into words first, then re-joining. It splits on a camelCase boundary (the regex ([a-z])([A-Z]) inserts a space), converts dashes and underscores to spaces, lowercases, and filters empty tokens - so 'Customer ID', 'customer_id', and 'customerID' all reduce to the same two-word set before being re-emitted as snake_case, camelCase, PascalCase, kebab-case, or SCREAMING_SNAKE. Abbreviation expansion is a finite, hand-built dictionary (ABBREVIATION_MAP), not AI inference: it matches whole tokens against entries like dept→department, qty→quantity, id→identifier, fname→first_name, txn→transaction, and dt→date, leaving any token it doesn't recognize unchanged. The Smart Suggest button chains expansion then snake_case in one click.
Beyond conventions, a Search & Replace field rewrites substrings across all headers; in plain mode it does a literal split/join, and toggling Regex Mode compiles your pattern with the 'gi' flags so matches are global and case-insensitive (an invalid pattern is caught and silently leaves the name as-is). Prefix and Suffix fields wrap each result (e.g. col_), and six Quick Presets bundle these settings - Database Style is snake_case with abbreviation expansion on, JavaScript Style is camelCase, React Component is PascalCase, CSS Class Style is kebab-case, Constants Style is SCREAMING_SNAKE, and With Prefix applies snake_case plus a col_ prefix. A Selective Mode lets you check individual columns so bulk transformations touch only those, and you can also Copy all new names to the clipboard or paste a newline-separated list back in to set names positionally.
Load the sample employee CSV (fname, lname, email_addr, ph_num...), pick the Database Style preset to apply snake_case with abbreviation expansion (fname becomes first_name, ph_num becomes phone_number), then Apply Renames so unquoted lowercase identifiers import cleanly. Only the header changes; all rows stay intact.
Choose the JavaScript Style preset (camelCase) to turn customer_id and email_addr into customerId and emailAddr, producing valid JS object keys. The tokenizer normalizes any incoming mix of snake_case or PascalCase to the same words first.
Use Search & Replace with find col_ and an empty replacement (or Regex Mode with ^col_ via the 'gi' flags) to drop a repeated vendor prefix across all headers at once, then download the renamed CSV.
No. Only the header row is replaced. Every data row is kept exactly as it was, so values and ordering do not change.
Yes. Pick a convention like snake_case or camelCase, or load a preset, and apply it to all headers. You can also enable Selective Mode to transform only the columns you check.
Yes. Turn on Regex Mode to use patterns instead of plain text. Regex matching is case-insensitive and applies to every header.
Rows and columns are parsed and transformed in memory in your browser. No record ever reaches a server.