Every feature, in one place.
96 of the things Intact CSV Editor does, from reading a file's dialect to exporting a PDF/A. All of them keep the promise: what you did not change, stays as it was.
Every file opens as a table, and the app says what it found.
The dialect of a text file is worked out when it opens — and every part of it is shown in the Format inspector, where it can be corrected. Anything the app had to guess is said plainly, with how sure it was.
Separators of every kind
Comma, semicolon, tab, pipe, colon, space, the ASCII unit separator, or any string you type.
Quoting and escaping
Double quotes, single quotes or none; quotes escaped by doubling them or with a backslash.
Line endings
LF, CRLF, CR — and files that mix them, which are read rather than refused.
80+ text encodings
Every Unicode form, the Windows and ISO code pages, the classic Mac scripts, DOS pages, East Asian multi-byte encodings, and 52 EBCDIC code pages.
Header rows and comments
A header row is recognised by comparing the first row's types with the rest. Comment lines are remembered and written back where they were.
Awkward files
Ragged rows, stray quotes, unterminated quotes and blank lines are read, not rejected — and the window says what it met.
Recognised by bytes, not by name
A workbook saved as export.dat still opens as a workbook; an ORC file is known by its first bytes.
Workbooks with several sheets
An .xlsx or .ods opens on its first sheet; the others are a click away, and the window says what else the workbook holds.
Open from a link
Paste an address and the file is downloaded and opened as a table. Only an address you typed or picked is ever fetched.
A folder of tables
One window lists every file in a folder the app can read — name, size, date — searchable, and one Return from being open.
Rules for where files live
Tell the app once that ~/Exports/DE holds semicolon files in Windows-1252, and detection is set aside for them.
Log files by pattern
A regular expression describes a line; each capture group becomes a column. Lines that do not match are counted, never dropped quietly.
Spreadsheet speed, without a spreadsheet's opinions.
Type, fill, drag and paste the way you would in a spreadsheet — and the file still gets back exactly what you typed, with no curly quotes, no dates made up and no numbers reformatted.
Type over a cell
A printable key replaces the selected cell's value; Tab and Return move on. The column's own values are offered as you type.
Fill handle
Drag the corner of a selection: numbers step, dates move on a day at a time, Item 1 counts up, plain text repeats. Double-click fills down.
Select as you think
Blocks, whole rows and columns, several blocks at once with holes in them, every match of a search — and invert any of it.
Move rows and columns
Drag them by their number or heading, move them with the keyboard like lines in Xcode, or send them to a numbered position.
Change the selected cells
Text in front or after, leading zeros off or on, decimals, the first or last characters, acronyms, random numbers, dates, UUIDs (version 7 included).
Write dates another way
Read a column in one shape and write it in another — ISO 8601, day-first 08.01.2026, US, Unix seconds, Excel serials. What is not a date keeps its text.
Write numbers another way
Convert a selection between 1234.50, 1234,50, 1,234.50, 1.234,50 and 1'234.50, keeping the decimals each value had.
JSON and lists inside a cell
⌥⌘J edits a cell's JSON as a tree, keeping key order and numbers exactly as written. ⌥⌘L edits a; b; c as a list.
Paste the way you mean
Paste transposed, paste as one plain value, or insert the copied rows and columns rather than writing over what is there.
Copy as anything
A selection goes to the clipboard as Markdown, JSON, SQL, HTML, YAML, XML, LaTeX, AsciiDoc and more — rich text lands in Pages, Word or Mail as a table.
Record view
The focused row shown downwards as labelled fields, for tables wider than the window.
Show what cannot be seen
Tabs as ⇥, line breaks inside a value as ↵, non-breaking spaces as ␣ — drawn only, the file is untouched.
Find the rows that matter, and put them in order.
Search with plain text or regular expressions, narrow the rows as you type, and sort by as many columns as you like — then put the file's own order back with one click.
Find and replace
Case, whole-cell and whole-word matching, regular expressions with $1 in the replacement, and a preview that lists every cell Replace All would touch.
Select every match
Turn a search into a selection, then change all of it in one step — or add the next match one at a time.
Filter as you type
The toolbar box narrows the rows at once. Switch on patterns and it understands *abc*, !x, 50+, 0-10, & and |.
Conditions
is, contains, begins with, between, at least — read as numbers or dates where that is what they are, over one column or all.
A filter on every heading
The column's values, most common first, with counts and a search box. The first click keeps only the value clicked.
Filters you can see
Every filter in force is listed, one line each, and each can be removed on its own. Saved filters are offered in every window.
Sort by several columns
⇧-click headings to add them to the sort, each showing its place in the order. Numbers sort as numbers, dates as moments in time.
The way back
A third click on a heading, or ⇧⌘U, puts the rows back in the file's own order — even after rows were edited, added or deleted.
Flags
⌥-click a row number to flag it; flags survive sorting and filtering, and ⌘J walks through them.
Filter across a row
For tables written the other way round: hide the columns whose heading, or any row, does not match a pattern.
The tidying every exported file needs.
Most files that arrive from another system need the same few things done to them. Each one is a command, shows what it will do, and is one step of undo.
Duplicates judged on the columns that matter
Two rows with the same customer number are the same customer, whatever else differs. Select them first, or remove them.
Empty rows, columns and edges
Remove the blank rows and columns a spreadsheet export leaves at the bottom and right; a blank row in the middle is left alone.
Trim and change case
Upper, lower, title, sentence, camel, Pascal, snake, kebab, UPPER_SNAKE, full-width and half-width.
Split and join cells
Join across a row or down a column with any separator, split them apart again, and close the gap a join leaves.
Escape sequences
Turn a written-out \n into a real line break, over a selection you choose — never automatically, because C:\new looks the same.
Headers over two rows
Turn the stacked header rows of a report into one name per column: Q1 over Revenue becomes Q1 Revenue.
Add an ID column
Number the rows into a column of their own, and renumber it rather than add a second one next time.
Split into several files
Cut a table into pieces of so many rows, each keeping the column names and the file's own dialect, numbered so they sort.
Answers without leaving the file.
Summaries, statistics, lookups and comparisons — the questions a table is usually opened for, without writing a formula or a query.
Summarise
Group by one column, spread another across the top, and sum, average, count or take the median — with nested groups and subtotals, like a pivot table.
Show the SQL
Every summary can show the statement it stands for and open it in the query console, so a summary is a starting point rather than a dead end.
Statistics
Every column counted: filled, empty, distinct, shortest and longest, and for numbers the median, spread and quintiles, drawn as bars.
Look values up in another table
Carry a customer's name and city over from another file by a key column, with a preview before anything is written.
Compare two files
Rows lined up by position or by a key, columns by name; changed values marked character by character and taken across one at a time.
The status bar adds up
Count, sum, average, minimum and maximum of any selection, each one a click away from the clipboard.
A summary row
Pin a sum, average, count, minimum or maximum under each column, over the rows on show.
Column inspector
A column's types, distinct and empty counts, minimum, maximum, sum and average at a glance.
MySQL-flavoured SQL over every open file.
⇧⌘R opens a query window. Each open document is a table named after its file, and only the tables a statement names are loaded.
Join files
SELECT * FROM customers JOIN orders USING (customer_no) — a CSV with a workbook with a Parquet file.
Files that are not open
FROM "@file:/Exports/archive.csv" reads a file by its path.
Views
Save a query by name and it becomes a table you can query — and open as a document that is always current.
MySQL's vocabulary
Backticks, # comments, SHOW TABLES, DESCRIBE, GROUP_CONCAT … SEPARATOR, DATE_FORMAT, REGEXP and MySQL's library of text, number, date and JSON functions.
Scripts and dumps
Paste a MySQL dump as it stands: the preamble is dropped, CREATE TABLE is cleaned of what only a server needs.
Numbers people write
Columns that hold 1'234.50 or 987,25 become real numbers, so they compare and add up correctly.
Long results a page at a time
101–200 of 4,318, with a step either way — and a statement with its own LIMIT runs exactly as written.
From the result
Replace the table with the answer, export it to any format, or open it as a new document.
Do it once, then never again by hand.
Macros for the edits a click cannot make, programs for the ones another tool already knows, and AppleScript for the ones that start somewhere else.
JavaScript macros
A small script over the selection or the whole table, in Tablecruncher's vocabulary. One step of undo; stopped after ten seconds if it runs away.
Run a program over the table
The table goes out as CSV on standard input; what comes back on standard output is read again. sort, awk, jq, a Python script — no shell involved.
AppleScript and Shortcuts
row count of table "sales", export table to "~/Desktop/sales.xlsx", run query "SELECT …".
The icsv command
icsv sales.csv --goto 120:3, psql -c '…' | icsv --header, icsv --diff yesterday.csv today.csv.
intact-csv:// links
Open a file at a row and column, with a separator and encoding, from anywhere a URL works.
The command palette
⇧⌘P finds any command by a few letters — rmdup finds Remove Duplicate Rows.
Your shortcuts
Rebind forty commands, including sequences like ⌃K then ⌃U.
Saved export formats
Any combination of export options saved by name — ten come built in, including Excel (European), Excel (US) and RFC 4180.
Write down the rules a table has always had.
An ID that must be there and unique, an amount that is never negative, a status that is one of three words. Write them down once, and every row is checked.
Rules for each column
What it holds (text, number, whole number, date, true or false), required, unique, a range, a list of allowed values, a regular expression.
Suggested from the data
The first thousand rows are read and the rules they already follow are written for you to correct.
Problems in the grid
Cells that break a rule are washed orange; ⌃⌘N walks through them, ⌃⌘K checks again.
A file beside the file
Keep the rules, frozen columns, quoting and sort order in a small .intactmeta file next to the data — the data file itself stays untouched.
Quoting under control
Quote per column, per cell, or only for separators; see which cells will get quotes before you save.
Locked documents
Lock a file and nothing edits it by accident — not typing, not pasting, not a bulk clean-up.
33 formats out, with the options each one needs.
Every export can choose its rows, its columns and their order, whether to include the names, how to write empty values and decimal separators — and a file's next export starts where its last one left off.
Columns and their order
Choose which columns go out and in what order; the choice is kept for the file for two years after it was last used, or as long as Settings say.
Spreadsheets
Excel .xlsx with a sheet name and a frozen header, OpenDocument .ods — a million rows in seconds.
Data formats
Parquet, Avro, ORC, Arrow, BSON, HDF5, SQLite, SQL inserts, JSON (flat or nested), JSON Lines, YAML, XML.
Statistics packages
SPSS, Stata, SAS transport, R data and MATLAB — with column names and types they understand.
PDF, ready to send
Paper sizes from A2 to Executive, wide tables kept readable across pages, repeated headings and key columns, page numbers — and PDF/A for archiving.
Word and rich text
A .docx with a formatted table, and rich text that pastes into Pages, Word or Mail as a real table.
Web pages that sort themselves
An HTML table, optionally with a small script to sort, filter and search it in any browser.
Printing
Printed the way the PDF export sets a table: repeated headings, page numbers, fitted to the width or broken into bands.
Millions of rows, and a window that stays smooth.
Files open straight away and stream in behind the window. Nothing that needs the whole table runs against a half-read one — so a file is never saved truncated.
First rows at once
A 325 MB file of 5.2 million rows is on screen in well under a second, and fully read about eight seconds later.
Compact in memory
Values are held as UTF-8 bytes: five million rows take 186 MB instead of 816 MB.
Work while it loads
Scroll, edit and search while the rest arrives; saving, sorting and SQL wait for the last row.
Off the main thread
Filtering, searching and column statistics run to one side, so the window keeps drawing.
Your file comes first.
An editor of other people's data must never lose it. Every save keeps the version before it; every edit is journalled until it is saved.
A copy before every save
What was on disk is kept aside for 30 days, with a preview for each version and a one-step restore.
Recovery after a crash
Unsaved work is offered back after a crash — as a copy, so you can compare before you decide.
Watching the file
If another program writes to an open file, a bar offers Reload or Keep Mine; unsaved edits are never thrown away unasked.
Undo for everything
Sorts, macros, replacements and pasted blocks, fifty steps by default.
Nothing lost in translation
A character the file's encoding cannot hold stops the save and is named — it is never written as a question mark.
Save as you go
Optionally write the file as soon as an edit settles, for people who would rather have no unsaved state at all.
Made for the Mac, and nothing else.
Native Swift and AppKit: fast to start, light and dark, tabs, keyboard everywhere, and the settings you would expect in the places you would look.
Eight languages
English, German, French, Italian, Spanish, Portuguese, Dutch and Polish.
Tabs for every file
Every document opens as a tab of one window; a middle click closes one, as in a browser.
Searchable settings
Type into the settings window and every matching setting is listed, under the words people actually use.
Settings as a file
Write every setting and changed shortcut to one readable JSON file, and carry it to another Mac.
Quick to start
About a quarter of a second to a start page, around 100 MB of memory.
Private
No account needed, files never uploaded, updates checked only if you switch it on. Details.
See it in one window.
Open your most difficult file.
Every feature for seven days, fourteen with a free account. No card, and your files never leave your Mac.
macOS 14 Sonoma or later · See pricing