Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Ledger to Beancount
#!/usr/bin/python
import ledger
import sys
import re
def account_name(post):
account = post.account.fullname().replace(" ","").replace("(","").replace(")","").replace("'","")
return re.sub(r'\:(\d)',r':X\1', account)
def get_symbol(amount):
symbol = amount.commodity.symbol.replace("-","").replace("\"","").upper()
if symbol == "$":
symbol = "USD"
return symbol
filename = sys.argv[1]
accounts = set()
for xact in ledger.read_journal(filename).xacts():
for post in xact.posts():
account = account_name(post)
if account not in accounts:
print "%s open %s" % (xact.date, account)
accounts.add(account)
print "%s * \"%s\"" % (xact.date, xact.payee)
for post in xact.posts():
account = account_name(post)
symbol = get_symbol(post.amount)
if post.amount.has_annotation():
price = post.amount.price()
if post.amount.number() != 0:
price = price / post.amount.number()
psym = get_symbol(price)
print " %-50s %s %s @ %s %s" % (account, post.amount.number(), symbol, price.number(), psym)
else:
print " %-50s %s %s" % (account, post.amount.number(), symbol)

proposal: in line 9 insert a new line with
account = account.title() # to force capitalization of the account names

Does somebody know how to include tags ?

This solution drops some features of my ledger file that I find quite important -- namely, comments and balance assertions. To address this, I wrote another ledger-to-beancount converter which works syntactically.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment