Features

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.

Opening files

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.

Editing

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, filter and sort

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.

Clean-up

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.

Analysis

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.

SQL

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.

Automation

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.

Validation

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.

Export and print

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.

Large files

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.

Safety

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.

A Mac app

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.

In the app

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.

Download free trial

macOS 14 Sonoma or later · See pricing