Track your reading with read.csv

And become a deeper reader

August 9, 2020 · Felipe Vogel ·

Ever since I started organizing my tasks and journaling with a custom todo.txt, I’ve been looking for other cluttered parts of my life to simplify. My reading is one of those.

I love reading, but I’ve always had trouble keeping track of my reading. In particular, a single to-read list and a single place for reading notes are, I think, essential for deep and reflective reading. But I’ve always failed at these. Every few years I got fed up with my uselessly scattered hodgepodge of reading lists, and so I went through them all and made a sleek new list… only to see it degenerate into the same old chaos within a few months. I often took notes on what I read, somewhere, but… dagnabbit, where did I put those notes? I always lost them, or stopped taking notes because they weren’t within easy reach.

Even the basic task of keeping track of what I read hasn’t been straightforward. For a few years I’ve been using Goodreads, but it has a few problems. It’s hard to track your reading of rare or old books with Goodreads, because you probably have to add them to the catalog yourself. Its main draw is that it’s also a social network, but I can only remember one time that I ever interacted with a friend on there. With every passing year it looks more and more like a graveyard, and complaints by its users have been getting louder. The most useful part of the site is the massive number of book reviews by users, but you don’t need a Goodreads account to look at reviews. As for the other social book sites, they’re not (as far as I can tell, as of 2020) any better than Goodreads.

So I’ve finally abandoned Goodreads, and now (as we speak!) I am basking in the glory of a unified approach to keeping track of my reading, my to-read list, and my reading notes. One list, hundreds of lines, zero headache. Here we go.

The end result

We’ll get into how to set it up, but here is a bit of my read.csv, where each column is distinguished by a color:

read.csv plain text reading list

So now I can pull up my list quicker than going into an app, and I can write notes that won’t get lost, and I can easily organize my to-read lists as well: the “currently reading” section above is followed by some short high-priority “will read” lists, followed by a long “done reading” list, followed by a bunch of low-priority “maybe will read” lists.

Wow, that format looks cumbersome, you might be saying with snicker. Writing out nine columns every time you want to jot down an interesting title?? No, because I can jot them down as a comment (starting with \ or any other character of your choosing), and then later use a custom AutoHotkey script to convert it to an entry, leaving only the “Bookshelves” column to fill in manually:

read.csv plain text reading list shortcut

If it’s an audiobook, I also add an audio symbol—just a few keystrokes, thanks to a text expander.

That last line, like many of my to-reads, is already CSV-formatted because it was exported from my Goodreads “Want to Read” shelf. (In that case, the “Date Started” column is “Date Added” from Goodreads.)

But the best thing about my read.csv is not just that it’s quick or pleasant to use. It’s actually changing the way I read for the better: having my notes always in view motivates me to take notes. And not just on my reading. I’ve begun to track courses, podcasts, and documentaries in there too—any educational or reflective media consumption that I feel is worth writing down.

If you want to try it yourself, here’s how.

1. Download your Goodreads data

If you’re on Goodreads, the first thing you need to do is export your library. This will give you a CSV file. Open it up and delete all the columns you don’t need.

If you’re not on Goodreads, simply create a blank CSV file. Onward!

2. Get the Rainbow CSV extension for VS Code

You could manage your reading list in Excel or another spreadsheet app, but then you lose the advantages of working in plain text with a good text editor. For me that’s VS Code, so I poked around and found the Rainbow CSV extension, which provides three key functions for our list:

For quicker sorting by a particular column (with a hotkey instead of a query), I’m using the Stable Sort extension.

For a hotkey to select a title (i.e. everything between the nearest semicolons) I’m using the Select By extension.

I also added the following lines to VS Code’s settings.json. (Adjust the font size to your liking.)

"[csv (semicolon)]": {
    "editor.quickSuggestions": false,
    "editor.wrappingIndent": "deepIndent",
    "editor.fontSize": 16
}

3. Make a hotkey to create new entries

Typing out nine columns for every entry is a pain, so instead I made an AutoHotkey script that takes the current line and turns it into an entry, with today’s date as Date Started. If the line has a comment character at the beginning, it automatically disappears. If I already added the ISBN after the title (after a semicolon), then it fills the ISBN column in the new entry. Here’s the script, assigned to the keyboard shortcut Ctrl + Shift + R:

^+r::
    oCB := ClipboardAll
    Clipboard := ""
    Send ^x
    Sleep,50
    beforeText = curr`; `;
    afterText = `; `;`#%A_YYYY%-%A_MM%-%A_DD%`;`;1
    Clipboard := beforeText . Trim(Clipboard, "`r`n\ ") . (InStr(Clipboard, "`;") ? "" : "`; ") . afterText . "`r`n"
    Send ^v
    Sleep,50
    Clipboard := oCB
    Send {Left 3}
    Sleep,50
    Send {Ctrl Up}{Shift Up}
Return

For adding the Date Finished, I have another shortcut, Ctrl + Shift + D:

^+d::
    SendInput {#}%A_YYYY%-%A_MM%-%A_DD%
return

Caveats and limitations

Some things to watch out for:

  1. Every column in every row has to have a value, even if it’s just a space, otherwise Rainbow CSV throws a fit when selecting that entire column. That’s why all incomplete rows (like jotted-down notes) have to be commented out.
  2. Quote marks surrounding a column are also a no-go. That’s why I’m using semicolons as separators instead of commas, so that I don’t have to quote every column containing a comma. That means that I can’t use semicolons in my notes, but… eh, who needs ‘em anyway.
  3. Entries can’t span multiple lines, and that means I have to write out my notes on a single line. But for me that’s an acceptable tradeoff for being able to keep my notes always in view.
  4. Multi-column editing is simplest on columns with a consistent format (in terms of number of words), so I’m using only single words in the “Bookshelves” column: rubyrails, dramapoetry, and econpolitics, for example.

Other possibilities

I don’t do these things with my read.csv, but you might want to:

I’m sure you could add on to this list. With plain text, the possibilities are endless.

👉 Newer: Set up Windows Terminal shortcuts 👈 Older: How I built this blog 🚀 Back to top