You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmymoney/contrib/csvbankingqif.py

152 lines
5.9 KiB

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
#
#***************************************************************************
# csvbankingqif.py - description
# -------------------
# begin : Sat 31 Oct. 2009
# copyright : (C) 2009 by Allan Anderson
# email : aganderson@ukonline.co.uk
#
#***************************************************************************/
#
#***************************************************************************
#* *
#* This program is free software; you can redistribute it and/or modify *
#* it under the terms of the GNU General Public License as published by *
#* the Free Software Foundation; either version 2 of the License, or *
#* (at your option) any later version. *
#* *
#***************************************************************************/
#
# *** NOTE ***
# It may be necessary to remove the second line, before running.
# It may be necessary also, to change the currency symbol if your file
# includes one.
#
# Simple utility to convert a csv format file, as from a bank, to qif
# format for KMyMoney2. There is no standard for the layout of such a
# file, but generally there will be a header line which indicates the
# layout of the fields within the file. Even then though, the order of
# the columns may vary. It is assumed, though, that the first column
# will contain the date, in 'dd MM yy' format, 'MM' being the month
# name or number.
# The second column is the detail. The third and fourth columns are
# assumed to be debits and credits. Even fron the same bank, these
# columns may be reversed, but the script handles this. Alternatively,
# the third column may be the amount. There may also be additional
# columns, such as current balance, but these are all ignored.
# Apart from the header line, there are likely to be other lines, with
# account number, balance details, etc. These are skipped.
#
# First, make the script executable: chmod u+x csvbankinyqif.py .
# The script should be added to the KMM QIF import profile. In KMM, open
# Tools/QIF Profile Editor and click on 'New' at the bottom. then enter a
# name, such as csvbank, then click 'OK'. Next, click on that name in the
# next window, and open the Filter tab. For the 'Input filter location',
# select the location you chose for the script file. For the Input filter
# file type, enter *.csv, or whatever extension your data file has.
# Finally, click 'OK'.
# When ready, select File/Import/QIF, and browse to your data file, then
# select your new filter profile, and click 'Import'.
#
#desc="date","detail","debit","credit"
mnths=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']
currency = '<EFBFBD>'
setup = True
debsfirst = False # credit column is before debit
both = False # only one amount column
print("!Type:Bank")
while 1:
try:
line=input()
except:break
if line == "" : continue # empty line
line = line.replace('"','',) # Strip out ' "' quotes
line = line.replace(currency,'',) # Strip out '<27>', etc. symbol
cols = line.split(',') # Seperator between columns
if setup:
#
# *** SETUP ***
#
dt = cols[0][0:2] # Might be a date (day)
datefound = ((dt > '0') and (dt < '32')) #this looks like a date
hdrfound = (cols[0] == 'Date')
if not datefound and not hdrfound: continue# still in hdrs
if hdrfound:
#
# *** 'Date', so now in header ***
#
hdrfound = False
#line = line.replace(' ','',) # Strip out spaces in hdr
cols[2] = cols[2].replace(' ','',) # Strip out spaces in hdr
if cols[2] == 'Debits':
debsfirst = True
continue
elif cols[2] == 'Credits':
debsfirst = False
continue
elif cols[2] == 'Amount':
both = True
continue
else:
print('Error in col[2]')
print('*** Error in header - col 2 s/b Debit, Credit, or Amount')
#continue
exit
setup ==False
#
# *** Transactions ***
#
cnum = 0 # First column
for col in cols:
if cnum > 3: break
#
# # Process Date
#
elif cnum == 0:
col =col.replace(' ','/',2) # Change date seperator to '/'
m = col.split('/')
# *** Check if month not numeric
mn = m[1][0:3] # Extract month string from field 2
fld = 2
try:
mnth = mnths.index(mn) # Get month number
except ValueError: # Field 2 not a valid month name
mn = m[0][0:3] # .. so try field 1
fld = 1
try:
mnth = mnths.index(mn)
except ValueError: # Nor is field 1
dat = ''.join(col) # ..so use as is (numeric)
else: # Field 1 is month name
dat = col[1:3] + str(mnth + 1) + '/' +m[2]
else: # Field 2 is month name
dat = col[0:3] + str(mnth + 1) + '/' +m[2]
line = 'D' + dat+'\n'
#
# # Detail column
#
elif cnum == 1:
#col = col.replace('"','')
line = line + 'P' + col +'\n'
#
# # Debit or credit column
#
elif cnum == 2:
if col != "":
if debsfirst == True: # This is Debit column
col = '-' + col # Mark as -ve
line = line + 'T' + col +'\n'
#
# # Credit or debit?
#
elif ((cnum == 3) and (both == False)):
if col != "":
if ((debsfirst == False) ):
col = '-' + col # Mark as -ve
line = line + 'T' + col + '\n'
cnum+=1
print(line + '^') # output this entry