Fixing the import from MS Money to Moneyspire

Waaaay back when, in early 2017, I published a small series (one, two) on replacements for Microsoft Money. One app which almost made the grade was Moneyspire. However, even that had some issues, of which one was insurmountable at the time: transfers between accounts were imported twice, making the end result of setting up your accounts in Moneyspire a complete and utter mess.

I abandoned the move and continued using Money. Nevertheless, Moneyspire improved in the interim and I paid for the upgrades when they appeared, hoping that basic functionality would get better.

Let me make clear though, although it works fine the issue with Money is two-fold for me. First is the obvious one: it was completely and utterly discontinued in 2010 and it’s only a matter of time before something happens to the OS and Money no longer works (indeed, there’s been a couple of issues over the years that have required patches). Second, the start-up time for Money is now horrendous for me – at least 5 minutes before it’s usable. Indeed, what I tend to do now is open it up every morning, and then check emails or whatever, until that initial start-up phase is complete. I don’t know if this is because I now have 23 years’ worth of data in it, or it’s still “phoning home” in some sense (although I understand this has been removed form the Sunset edition), but it’s painful.

A couple or so weeks ago, it suddenly got worse: for some ungodly reason, the Money importer program would no longer automatically open QFX files from my financial institutions. I did manage to fix it (hello, RegEdit), but I was faced with a dilemma: continue clutching at straws with Money, or move to another app?

Time to check out Moneyspire again. I installed the latest version (it has had some welcome changes since that blog post I mentioned above, let me tell you) and then tried to import exported QIF data from Money. The QIF files imported OK, but again all transfers between accounts were still duplicated. This time though I decided to try and figure out a solution.

Imagine a transfer from a checking account to a credit card: the transaction is paying off (some of) the outstanding debt on the credit card. Because the QIF files are exported by Money per account that transfer (and all similar ones) appear in both QIF files for those accounts. Moneyspire makes no attempt to match up those duplicate transfer transactions and so, after importing all the QIF files, the balances calculated and displayed by Moneyspire are seriously wrong: every transfer appears as two transactions in a given account. One is a “from” transfer and the other is a “to” transfer in some sense.

Double entry bookkeeping

Doubled transfer
(image from old Moneyspire)

The solution then is to “fix” the QIF files that are exported from Money somehow, so that when they are imported into Moneyspire these duplicate transactions are no longer, well, duplicated. Since I am a programmer, I decided to write an app. What this app was going to do was to read the QIF files, remove the duplicates, and write out new QIF files that could then be imported into Moneyspire.

The QIF file format is a veritable sight to behold. Basically each transaction appears as multiple lines, with the end of record signaled by an end of record ^ line. Each line in a transaction record has a single-character field identifier in the first position, and the rest of the line is the data for that field.

Example QIF transactions

Example QIF transactions

The app reads a complete multi-line record from the input QIF file and tries to determine if that record is a transfer transaction. If the record is not a transfer, it is written exactly as read to the output file.

If it is a transfer (there will be a Category line with the name of an account enclosed in square brackets: for example [MyAccount]), the sign of the amount is then looked at. If negative, the record is allowed through and is written to the output file; if positive, the record is ignored and is not written out.

Example QIF record: transfer from bank

"From" transfer transaction


Example QIF record: transfer to credit card

"To" transfer transaction

Why? Think of a transfer as being an active withdrawal from one account to a passive deposit in another. The receiving account, if you like, is just sitting there and money is dropped in on it. It is that side of the transaction which is being ignored by the app.

I finished the app, tested it on some old QIF files, and then went for broke. I exported all banking and credit card accounts from Microsoft Money, ran my app on the resulting QIF files, and then imported the processed QIF files into Moneyspire. And … lo and behold … all worked and the resulting accounts in Moneyspire had the correct balances. Phew!

Now, to continue testing Moneyspire on a daily basis. I shall play around for a month with this, and, if it doesn’t work out I can easily download a month’s worth of data from my financial institutions into Money again and start reusing it. Stay tuned to see how I get on!

(The app is available on GitHub. It’s a node.js app, so requires Node to be installed on the machine. There are two required libraries, however both are installed with Node so there’s nothing else to install. For simplicity, the code assumes that the exported QIF files are in the same folder as the app. It will process every QIF file it finds there, and creates a new QIF file for each, with "Fixed-" prepended to the filename. So, for example, MyAccount.qif gets processed and Fixed-MyAccount.qif is the resulting file. Import those “Fixed” QIF files into Moneyspire.)

new Moneyspire logo

Loading similar posts...   Loading links to posts on similar topics...

No Responses

Feel free to add a comment...

Leave a response

Note: some MarkDown is allowed, but HTML is not. Expand to show what's available.

  •  Emphasize with italics: surround word with underscores _emphasis_
  •  Emphasize strongly: surround word with double-asterisks **strong**
  •  Link: surround text with square brackets, url with parentheses [text](url)
  •  Inline code: surround text with backticks `IEnumerable`
  •  Unordered list: start each line with an asterisk, space * an item
  •  Ordered list: start each line with a digit, period, space 1. an item
  •  Insert code block: start each line with four spaces
  •  Insert blockquote: start each line with right-angle-bracket, space > Now is the time...
Preview of response