Several folks have written asking about the CSV-to-IIF script that I mentioned in this column. It's a humble thing, and likely won't work directly with your bank's output format, but if it's a helpful example I'm happy to share.
# Script to convert CSV to IIF output. I run it like so: # # python qb.py > output.iif import sys,traceback,re def error(trans): sys.stderr.write("%s\n" % trans) traceback.print_exc(None,sys.stderr) # This is the CSV format that my bank emits. Yours likely differs. # I copy the CSV data from the bank's export page, and paste it here # between the triple quotes. csv = """ 4/30/2006,-12.93,"","","EASTERN PROPANE GAS" 4/30/2006,-28.94,"","","AMZ*SUPERSTORE AMAZON .COM WA" """ # This is the name of the QuickBooks checking account account = "Walpole Checking" # This is the IIF template template = """!TRNS\tTRNSID\tTRNSTYPE\tDATE\tACCNT\tNAME\tAMOUNT\ \tDOCNUM\tADDR1\tADDR2\tADDR3\tMEMO !SPL\tSPLID\tACCNT\tAMOUNT\tMEMO !ENDTRNS TRNS\t\tCheck\t%s\t%s\t%s\t%s\t%s\t\t\t\t SPL\t\tUncategorized Expenses\t%s ENDTRNS""" # And here's the part that squirts the data through the template lines = csv.split('\n') for trans in lines[1:-1]: try: list = trans.split(',') assert (len(list)==5 ) except: error(trans) continue try: (date,amount,serial,descr,comments) = list m = re.search('(\d{1,2})/(\d{1,2})/(\d{4})', date) assert ( len(m.groups())==3 ) except: error(trans) continue try: amount = float(amount) except: error(trans) continue serial = serial.strip('"') if ( serial == ''): serial = 'visa' descr = descr.strip('"') comments = comments.strip('"') if ( comments == ''): comments = descr comments = comments.replace('ATM POS Debit/','') comments = comments.replace('ACH Withdrawal/','') print template % (date,account,comments,amount,serial,-(amount) )
Former URL: http://weblog.infoworld.com/udell/2006/04/22.html#a1433