How to open and edit a CSV file on Mac
You can do this with Note My. It opens a CSV as what it actually is — a text file — so nothing is reinterpreted on the way in, and nothing is rewritten on the way out.
A CSV is a text file. Every value in it is a run of characters between two commas, and that is all the format promises. The trouble starts when something opens it, decides what those characters mean, and writes its opinion back to disk.
Here is what that looks like. A postcode becomes a number and loses its leading zero. A part code like 3-12 becomes the twelfth of March. A long identifier turns into 1.23457E+15. None of that is in your file. It is what a spreadsheet did to your file.
Note My never does any of that. It opens a CSV as text, shows you the characters that are actually there, and writes back exactly what you leave behind. The whole job happens on your Mac: there is no account to make, nothing is uploaded, and the file never leaves the machine.
A .csv opens as Plain Text, which is what the format actually is: every character in the order it was written, at whatever size the export happens to be. Find & Replace, bookmarks, our encoding handling and our hidden-character scanner all point straight at it, and what you leave on the screen is what lands on disk.
Open the file
-
Open it the ordinary way
Press ⌘O and choose the file, or drag it from the Finder onto the tab bar. Right-clicking in the Finder and choosing Note My ▸ Open works too, once the Finder extension is enabled.
If your Mac insists on handing
.csvto something else, ⇧⌘O — File ▸ Open Anything as Text… — opens it regardless. Doing that does not change what happens the next time you double-click a.csvin the Finder: Note My never makes itself the default application for a file type, so you can use it for one awkward export and leave everything else as it was. -
Read the status bar before you read the file
It tells you three things worth knowing about an export you did not create: how many lines there are, which encoding it is being shown in, and which line ending the file uses. All three are the usual causes of a CSV that will not import cleanly somewhere else.
Chars 2 411 908 Words 318 442 Spaces 402 117 Lines 51 204 Sel 0 Occ 0 ✓ Clean ↵ LF Aa UTF-8 {} Plain Text ⌘ IdentifySix counters, live: characters, words, spaces, lines, the size of the selection, and how many times the selected word occurs. They are cached on the document, so a keystroke does not recount two million characters. -
Check the header row
⌘L takes you to a line number, so line 1 is one keystroke away. It arrives pre-filled with the line you are on, selected, so it also answers "where am I?" in a file with a hundred thousand rows.
A very large CSV
This is where a text editor earns its place. A million-row export is a large text file, and Note My is built around that being the normal case rather than the exception.
Our large-file engine carries the weight of it, so a long export is something you work in rather than something you wait on. You can scroll, select, search and type in it as you would in a short note, and the line count in the status bar tells you how many rows you are dealing with. Nothing is truncated and no rows are hidden from you — the document you get is the document on disk, however many rows that is. That matters most with the exports nobody chose the size of: a full customer dump, a year of log lines, an archive somebody sent you and asked a question about.
Two habits make a file of this size comfortable rather than daunting. Move by line number instead of scrolling, and use bookmarks to collect the rows you care about before you do anything to them. Both are covered below, and both hold up in a file you could never read end to end.
| What you want | How to get it |
|---|---|
| Land on a particular row | ⌘L, then the line number |
| Know how many rows you have | The line count in the status bar |
| Change the same thing in every row | Find & Replace with Regular Expression ticked |
| Keep only the rows that match | Bookmark the matches, then Copy Bookmarked Lines |
| Drop the rows that match | Bookmark the matches, then Delete Bookmarked Lines |
Pasting a large block into a CSV is comfortable as well. A very big paste puts up a progress sheet you can cancel, so a paste you did not mean to make is never a wait you are stuck with. Paste is always plain text, so a block copied out of a web page arrives as characters rather than as formatting you then have to strip out of your data.
When the accented characters are wrong
An export full of é and ü is not a corrupt file. It is a correct file being read with the wrong encoding, and it is the single most common thing wrong with a CSV that came from somewhere else.
Use File ▸ Encoding ▸ Reload with Encoding…, or the encoding pill in the status bar, and pick the encoding the file was actually written in. Windows-1252 accounts for most Western exports; Shift JIS, EUC-JP, GB18030 and Big5 cover the CJK ones. The menu offers eighteen in all, with the ones you are most likely to need at the top and the rest grouped below, so our encoding handling covers the awkward export somebody sent you as readily as the tidy one you made yourself. If the first choice is wrong, pick another — you can try as many as you like, and the file on disk is untouched while you do.
Reload with Encoding… shows you the file that is already on disk read a different way. It changes nothing about the file itself. Convert to Encoding… changes what will be written the next time you save. Reload to fix a misreading; convert to change the file.
Line endings, and the byte order mark
A CSV written on Windows uses CRLF; one written on a Mac or in a Unix pipeline uses LF. Most importers cope. Some do not, and a mixed file — half CRLF, half LF, because two tools appended to it — trips almost all of them.
The line-ending pill in the status bar says Mixed when a file contains more than one kind, which is the fastest way to spot it and the reason it is worth a glance before you send an export on. File ▸ Line Endings converts the whole document to LF, CRLF or CR, and Show Line Ending Details… reports what is actually in there.
The other invisible troublemaker sits at the very start of the file. A byte order mark there is legitimate, so it is left exactly where it is rather than swept up with the invisible characters you do want gone. A CSV importer that is not expecting one, though, will read your first header as id rather than id and fail to find the column. If that is happening, the document's encoding is UTF-8 with BOM; convert it to plain UTF-8 and save.
Editing across every row at once
This is what a text view buys you. A spreadsheet edits cells; Note My edits the file, which for a CSV is often exactly the operation you want.
Open Find & Replace from the magnifying-glass button in the toolbar. Tick Regular Expression and the field becomes a pattern; the replacement field takes template substitution, so $1 refers to your first capture group.
| To do this | Find | Replace with |
|---|---|---|
| Swap the first two columns | ^([^,]*),([^,]*), | $2,$1, |
| Quote every value in the first column | ^([^,]*) | "$1" |
| Drop a trailing comma from every row | ,$ | (leave empty) |
| Turn semicolons into commas | ; | , |
The magnifying-glass button gives you the whole pop-over: pattern field, replacement field and the options beside them. ⌘F opens the system find bar, which is the quicker route when you only want to look for something rather than change it.
Two things are worth knowing at this size. The live count beside the field moves as you type, so you can weigh the scale of an edit before you commit to it and tighten the pattern — anchoring it to the start of a line, say — until the number settles on the one you were expecting. It stays candid with you while you work: on a query that matches an enormous part of one document the label says so rather than quietly rounding, and a narrower pattern brings the exact figure straight back. And Replace in All Files reaches every tab you have open, while Search ▸ Find in Folder… (⇧⌘F) sweeps a whole directory of exports and only ever reads them, which is how you answer "is this value anywhere in this year of files?" without opening a single one by hand.
Deleting rows that match something
You can strip every row that contains a particular value in two moves, and they are worth learning by heart, because this is the CSV operation people reach for most.
Search for the value, then use Bookmark All Search Matches (⌥⌘B) to mark every line that contains it. Search ▸ Delete Bookmarked Lines then removes them in one operation, asking for confirmation first by default. Copy Bookmarked Lines does the opposite job: it puts just the matching rows on the clipboard, which is how you keep a subset rather than discard one.
Characters you cannot see
A CSV that looks identical to a working one but fails to import usually contains something you cannot see. Our hidden-character scanner finds those for you, so you do not have to know in advance what you are looking for.
Click the hidden-character pill in the status bar and the popover lists what is in the document, with Show in Text to reveal a finding and Review All… to open the full sheet. The categories that matter for a CSV:
- Non-breaking spaces pasted from a web page or a word processor. They look exactly like spaces and match nothing.
- Zero-width characters that pad a field invisibly.
- Trailing whitespace at the end of a row, which turns the last column into a value with a space on it.
- Smart quotes where the format wants straight ones — a quoted field opened with
"and closed with”is not a quoted field. - A lone carriage return with no line feed, which some readers treat as a row break and others ignore entirely.
To look rather than clean, switch on the toolbar Show Invisibles toggle. It changes how the text is drawn and never the file itself — removing characters is a separate command under Clean ▸ Clean Invisible / Special Characters…, which edits the document and can be undone.
Comparing two exports
Yesterday's export against today's is a common question and a genuinely awkward one in a spreadsheet. Our comparison view answers it about the two files as written. Open both files, then use the toolbar Compare menu — Compare Files… to pick the pair on a canvas, or Quick Compare when the two you want are the only two open.
Differing lines are painted in place in both panes, with an inspector that walks you through change by change. Hold ⇧ and the two panes scroll together, so you can follow a run of rows down both files at once and let go the moment you want to move through one of them alone; ⎋ leaves compare mode. The answer you get is about the characters in the two files, which is the level at which an import failure actually happens: a delimiter that changed, a column that moved along by one, a row that arrived carrying an extra field. Once you can see which rows moved, the rest of this page picks up the work — bookmark them, lift them into a tab of their own, or fix them across the whole file in one operation.
Why the values survive
The reason a CSV comes out of Note My unchanged is not a setting you have to go and find. None of the automatic text assistance is ever switched on. Automatic spelling correction, quote substitution, dash substitution, text replacement, link detection and data detection are all off, everywhere in the editor, and there is no mode in which any of them comes back.
That decision was made for exactly this class of file. A CSV sits alongside .env files, Dockerfiles, Makefiles and extensionless scripts, and a curly quote or an em dash in any of those breaks the file for whatever has to read it next. Your typed characters are never rewritten behind your back, so a leading zero stays a leading zero and 3-12 stays 3-12. Nothing is checked against anything online either — the file is read, edited and saved by your Mac alone.
What else the text view buys you
Because a CSV is only ever text, the rest of the editor is there for it too — the same tabs, bookmarks, encoding commands and recorded sequences you would use on any other file. A handful of them come up again and again with exports.
- Lift out a subset. Bookmark the rows you want, run Copy Bookmarked Lines, and paste them into a new tab with ⌘N. Save that and you have a smaller file to hand on, with the original sitting untouched in the tab beside it.
- Normalise before you send. Convert the document to UTF-8 and its line endings to LF in two menu commands, so the export reaches the next system in the shape that system is expecting rather than the shape it happened to arrive in.
- Keep several exports open at once. Every tab carries its own line count, encoding and line-ending pills, so a mismatch between two files announces itself before you go hunting for it.
- Repeat a tidy-up. When the same export lands every week and wants the same short sequence of edits, our macro recorder plays that sequence back instead of asking you to perform it again by hand.
- Work without holding your breath. Our auto-recovery safety net holds on to what is in the editor, and File ▸ Reload from Disk (⌘R) puts you back to the last saved version of the file whenever you want a clean start.
The habit that ties all of this together is a small one. Decide what you want the file to look like, make the change across the whole document in a single operation, then read the status bar to confirm the result. A CSV rewards that far more than it rewards working through it row by row, and it is why a file of half a million lines takes about as long to fix as a file of fifty.
What matters about an export is the file itself: the exact characters, in the exact order, at whatever size the thing turned out to be. That is what you are reading here, that is what you are editing, and that is what gets written back when you save.
Troubleshooting
The first column header has a stray character in front of it
A byte order mark. The document's encoding is UTF-8 with BOM; use File ▸ Encoding ▸ Convert to Encoding…, choose plain UTF-8, and save.
Every accented character is two symbols
Wrong decoding, not corruption. Reload with Encoding… and try Windows-1252 first.
My regular expression matched the wrong things
Almost always a quoted field containing a comma. [^,]* stops at the comma inside "Smith, John". Anchor the pattern to the start of a line to keep it honest, or search for " first, bookmark those rows with ⌥⌘B and give them a pass of their own.
The file changed while I had it open
You will be told, for every file you have open. When something outside the app changes one, you get a sheet offering Reload or Keep My Version. Keeping your version marks the tab as having unsaved work and protects it, so a nightly job overwriting the export does not silently take your edits with it.
The line count keeps climbing after the file appears
The file is still opening, and the count settles by itself a moment later. Our large-file engine hands you a long export to read and edit straight away, so there is nothing to wait for: search it, bookmark in it and edit it while the number is still moving. Nothing is being left out of the document you are working in.
I want the rows that match, not the ones that do not
Bookmark the matches with ⌥⌘B, then use Copy Bookmarked Lines and paste them into a new tab (⌘N).
Frequently asked questions
Will Note My change my data when I save?
What you leave on the screen is what gets written to disk, character for character. None of the automatic text assistance is ever switched on — no autocorrect, no quote or dash substitution, no data detection — so a leading zero stays a leading zero and 3-12 stays 3-12. The one thing that does change on save is the line ending, and only if you asked for a conversion.
How large a CSV can it open?
There is no row limit and no size cap in the app. Our large-file engine is built for exports of a million rows and beyond, so a file that other tools refuse to open, or open and then sit on, opens here and stays workable — scrolling, searching, bookmarking and editing all behave the way they do in a short note. The room you have is your own Mac's, not a number we decided on your behalf.
How do I find the rows with the wrong number of fields?
With Find & Replace and Regular Expression ticked. A pattern anchored to the start of a line and counting delimiters — ^([^,]*,){5}[^,]*$ for a six-column file — matches every row that is the right shape, and ⌥⌘B puts a mark in the gutter beside each one. To work on the rows that did not match, run Search ▸ Invert Bookmarks With Matches while the search is still live and the marked set flips to the odd ones out. Copy Bookmarked Lines then lifts whichever set is marked into a new tab, so you can read the strays on their own without touching the export they came from.
Can I open a TSV or a pipe-delimited file the same way?
Yes. Any delimiter is just a character in a text file, so a tab-separated or pipe-separated export opens exactly the same way and every technique on this page applies unchanged. Turning on Show Invisibles is particularly useful for a TSV, because it draws the tabs.
Does the file get uploaded anywhere to be processed?
Your CSV stays on your Mac, from the moment you open it to the moment you save it. Note My contains no networking code of its own; the only network activity is performed by Apple’s own system services, to establish purchases and transactions state. There is no account, no sign-in, no telemetry and no analytics, and it is fully sandboxed, so it touches only the files you hand it. That is worth knowing when the export is a customer list, a payroll extract or anything else you would rather not send through something on its way to being read.
Can I undo a replace across the whole file?
Yes. A replace across the whole file is an ordinary edit, so ⌘Z steps it back in one go however many rows it touched, which means you can try a pattern, look at what it did to the file and think again as often as you like. On a file that matters, save before a large replace as well: that puts File ▸ Reload from Disk (⌘R) behind you as a second way back, and reloading only ever reads the file on disk — it never changes it.