#!/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 = '£' 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 '£', 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