mt940 is a small program to interactively process a file stored in MT940 CSV format (which is exported by at least one large German bank) and store the results in ledger format.
mt940-ledger only depends on the readline library, make and a recent C++11 compiler (gcc-4.9 or clang). On Ubuntu, you can install the package libreadline-dev
and build-essential
and you should be good to go.
To build mt940-ledger, simply clone the repository, switch to it and execute make
. The executable produced will be called mt940-ledger
. If your compiler is clang, use make CC=/usr/bin/clang++
to build. Currently, there is no install
target available, and the Makefile isn’t set up with proper care (pull requests welcome).
If you’re using the Nix package manager, just run nix-build
and you can execute the program via result/bin/mt940-ledger
.
mt940-ledger has a lot of command line parameters, all of them are mandatory (because I was too lazy to implement optional command line options). Let’s see what a sample call looks like and what it does. Let’s say you have the following sample mt940-csv file (called sample.csv
):
"Target account";"Booking date";"Value date";"Posting text";"Purpose";"Payer";"Account number";"BIC";"Amount";"Currency"
"133731338";"29.01.16";"29.01.16";"Music for you";"SVWZ+Spotify";"Friend of mine";"DE423424295235";"INGFOOBAR";"-7,00";"EUR"
...
In the shell, we enter the following
./mt940-ledger \ --separator=\; \ --skip-header=true \ --date-format=%d.%m.%y \ --column-date=1 \ --column-summary=3 \ --column-purpose=4 \ --column-payer=5 \ --column-amount=8 \ --column-currency=9 \ --template-file=tem.txt \ sample.csv \ /tmp/output.dat
As you can see, there’s a template-file
argument. Each entry in the csv file is mapped to this template, inserting the appropriate placeholders. tem.txt
looks like this:
${date} ${purpose} ; summary: ${summary} ; purpose: ${purpose} ; payer: ${payer} ${account} ${amount} ${currency} Assets:Main
The output of the call above is the following:
2016/01/29 Spotify ; summary: Music for you ; purpose: Spotify ; payer: Friend of mine ${account} -7,00 EUR Assets:Main enter “s” to skip the entry, ctrl+d to exit purpose [Spotify]
Now we enter the purpose or press return to use “Spotify” as our purpose (which is fine). Then we are prompted for the target account (for example Expenses:Leisure:Music
) and then /tmp/output.dat
gets a new entry:
2016/01/29 Spotify ; summary: Music for you ; purpose: Spotify ; payer: Friend of mine Expenses:Leisure:Music -7,00 EUR Assets:Main
The following parameters exist (columns start with index zero, boolean values are yes/no,0/1,true/false
):
Parameter | Description |
---|---|
template-file | See above example |
separator | CSV separator |
skip-header | Skip the first line of the CSV file |
date-format | CSV date format to parse via strptime |
column-date | Column for the date |
column-summary | Column for the summary (negative if not present) |
column-purpose | SWIFT column for purpose (negative if not present) |
column-payer | Column for the payer (negative if not present) |
column-amount | Column for the amount |
column-currency | Column for the currency |
SWIFT columns follow the SWIFT coding. If your CSV file has a column with funny strings in it like SVWZ+
or +EREF
, it’s SWIFT. Use column-purpose
on it. mt940-ledger will parse the “real” purpose from it.
There are two positional arguments (ones without a --foo=
parameter in front of them). The first one is the input CSV file, the second one the output file. There is no magic -
constant meaning stdout
.