Import text files of foreign accounting programs

Niklaus Giger ngiger@mus.ch
Sun, 9 Jun 2002 22:52:47 +0200


--------------Boundary-00=_ZZHGENQHSEJD4S692HJW
Content-Type: text/plain;
  charset="iso-8859-15"
Content-Transfer-Encoding: quoted-printable

Hi,

Thanks everybody for your fine pieace of software, which I=20
use every week or so to keep track of my personal finances.=20
I really appreciate it.

Since I switched to GnuCash two years ago, I wanted to be=20
able to import the old accounting data into it. Not having=20
enough time to dwelve into this problem, some time passed.
(And I have not written a single line in Scheme, so the=20
source code was not a easy reading for me. Neither seemed=20
the Quicken format to be a easy one).

The data I had was in a simple clean text format though I=20
knew it would be easy to parse it, but a bit more=20
complicated to transform it into the GnuCash format. But=20
the transformation to the XML format was welcomed by me.
A couple of weeks ago I stumbled about REXML a XML-parser=20
for Ruby, so I decided to write a small script and it=20
proved to be quite easy, and I successfully converted all=20
my old accounting data to GnuCash. (Well some very old is=20
in a binary format which the newest version of this=20
commercial products doesn't open any more .-)

I have seen that you are trying now to some more work for=20
importing (HBCI) and hope you succeed with. I will give the=20
source code a look, but I do not know whether I will have=20
some time to lend a hand.

Could somebody give it a look? Is it good enough to be=20
added to the GnuCash, may be just somewhere as a not so=20
much supported utility? I think for the one time job of=20
importing old data it might be simple to understand than=20
the whole bunch which forms GnuCash.

Now follows the gnc_import.README
Readme for gnc_import.rb
------------------------

09-June-2002 Original version by Niklaus Giger ngiger@mus.ch

gnc_import.rb is a utility script to convert foreign=20
accounting data into GnuCash.
It was written to import data produced by Cashbook (a swiss=20
accounting program)
and MacHaBu (a german accounting program), and worked for=20
my purposes well enough.

If you send me examples of human readible text files =20
produced by other=20
accounting programs, which you would like to import into=20
GnuCash I will try to=20
adapt this utility to fit your needs (in the limits of=20
spare time I have).
A description (if available) and a sample file/s including=20
a few accounts
and transactions should suffice.

If this utility get accepted into the GnuCash code, I will=20
add a generic text
module which would allow to import all fields of the=20
account and transaction
records supported by GnuCash. Support for multiple splits=20
in one transaction
will only be added if I get hand on samples of real output=20
of another
accounting program.

I have no intentions to make this utility acapable of=20
reading such a brain
damaged data format like Quicken.


Prerequisites:
--------------

1) You need ruby (I am running version 1.6.7). Which is=20
available as
a Debian package or can be downloaded from=20
http://www.ruby-lang.org

1) You need REXML. A XML parser for Ruby, in Ruby.
URL: http://www.germane-software.com/software/rexml
Many thanks to its author: Sean Russell=20
<ser@germane-software.com> who=20
answered my silly questions a quickly fixed a bug in the=20
XML-output.
You need version 2.3.4 (30-May-2002) or later.


Things to change in gnc_import.rb before importing your=20
data.
-------------------------------------------------------------

a) Look for Currency and CurrencySCU and change them to=20
your local currency.
b) Change RecordSep to match your text files (e.g.=20
Mac/Win/Unix convention)

If I get enough user feedback, I will let my uses be able=20
to specify this=20
interactively or through program switches.


Testing
-------

Try the following commands
$ ./gnc_import.rb tst_cashbook.accounts=20
tst_cashbook.journal tst_cashbook
$ gnucash tst_cashbook
It should generate a valid GnuCash data file, after having=20
complained about
invalid data like
Cannot represent dates before 1970. Line 26.07.1920    =20
Jazzschuhe Cynthia\
      11      3030    1000    145.00


Assumptions
-----------

In order to simplify my first tests I made the following=20
assumptions for the data imported,
which were all guaranteed by the exporting applications.

Assumption 1:
All transaction are made in the same currency.

Assumption 2:
A transaction always consists of exactly two splits. One=20
for debit and one for credit

Assumption 3:
Accounts are uniquely identified by their code number, a=20
integer.

Assumption 4:
All amounts are specified in dollar/cents.(SCU is 100).


Open issues:
------------

Format for numbers and dates is fixed. E.g. 31.12.1998 for=20
dates
and 5'489.45 or 5489.45 for=20


Utility scripts to import foreign encoding (Mac, Windows,=20
etc)
--------------------------------------------------------------

Before my financial information was handled on my Mac. I=20
used
the following small script to convert its encoding to the=20
one
normally used in Western Europe on my GNU/Linux system=20
(running
Debian).

The input files were all named *.txt and converted to *.iso.

iconv --list

gives you a list of all supported encodings.

#! /usr/bin/zsh
for i in *.txt
do
  echo i ist $i outputname ist ${i/.txt/.iso}
  iconv -f MAC -t iso8859-1 $i --output ${i/.txt/.iso}
done

Limitations:
------------

The XML-building process is quite slow and consumes a lot=20
of memory.
E.g. importing 70 accounts and about 1300 transactions=20
takes about
3 minutes and 60 MB on my 500 AMD system with 192 MB RAM.=20
The produced
file is about 1.4 MB. Balance and Loss/Profits show the=20
correct totals.
If I go to the general ledger, I do not see any entries. I=20
have to=20
select Register..Date Range..Select all

If you have any problems do not hesitate to contact me=20
(ngiger@mus.ch).

Regards
--=20
Niklaus Giger
Wieshoschet 6
CH-8753 Mollis
ngiger@mus.ch Tel. G: +41 55 618 64 68, P: +41 55 612 20 54

--------------Boundary-00=_ZZHGENQHSEJD4S692HJW
Content-Type: application/x-gzip;
  name="gnc_import.tar.gz"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="gnc_import.tar.gz"

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
VH88+Lh2+PDFlfSWOcB1gNEIZuV4KsBnVnEpnryn1ZA+8coTNk34HJqAEO6fPvuHMXM4fBM46Gi3
VIKPQeVBVUM8kCmHVQ6c4hqTP6JnzOeaU2JUgKIkLoFLPU0EG/hcmHOG1G/n3AjCqHo3KmFQm1OF
Bry7BN6twPOyuFicQOxXs6qB91zwmtxV4ZnF02abs80VDW+Olxhm2mPtVdB4yyPG/BOF9Z8VSXG+
UvK5PjBrjrH16/Eq1cU67wdvTtzarHHGBq8Xeq/RFYfNgRCpMkdteHUcD5m96Rll0IBnco7SVp3e
IwEZUW/oOasR1rN0NETMHd/UVgmS+ZXEk9+C1uLptKiOnG/9ePJ8yx6bBkh4hAF/bwr0TtvDcRZu
feg9erhtHnwCe/iQQePvRZiQYWl5QJzlTTrcPCGqb2FSzwcI93CGH0Z60/+879vtKIYwdve+Rz0F
Ms/r2XeR/LHO3P2cWofdT3RYy74vS5N9bbFf2cfLj1b+6vFt87LFfrtBpu+DN62Up8q1RJGIWJbP
2tZs4lh1goiupDjEQU2sTt/R0X/MeF9+9OrHT5wzKpZ6bXYJQLXTe2/P+83LQJ/ntq1b2mjaiICM
AYQFtg25/wqBjgJo3et9o4oIjFgwSko1ualNmGV7ZdL19rz/LWPNa3ZqxQZE0zE91g5ZuVkSHHdz
k4THtYvLVKsPh2iniz5FuRsj3H4UrSCavY6zZIbo9FnHMwd3IxLPesM9fRXlYfCIiZ9LWNhjqt5W
BvoSVcpBmvl7vDcGLpNOSjxgS/M3FKoLN3Wvj7155Feb+LZBXfTxJodJR9gDbhA3LiFm9mg7M9uI
V45pVecXlLMnCeDp/MIeZnZO0PVgYTDa3kDYy0DX00GeltsiGKty+HXTfxuwc0pL4VSq0xZ2T5zi
ddvkyqursm8vA4oLz1cj8rf8207LpdclRDqyrDC5gr2wGRYz9usEp/hOx2puNsx8494Xc/0lcBnv
TOnrUiSkdb0kqcXWFIvmJNwUGzy89auNvH57pHPulYwWszikVUtagijS+gdejG0GL7Ukt0g0faEN
g7w2yCSIKT6aCM4d0E3e/xw7939h7OmXuOCK93/v7u6uuf/buXdvd8fc/4W/u1De3e3duff/939v
4nNKTKestCsKQ29rzcfzOve3/l5mYovuAtvcSXWbdvnOMKtdFva8Wi+4+uesLICyEONqE4IaaHbK
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


--------------Boundary-00=_ZZHGENQHSEJD4S692HJW--