From 81b37ddbd593a42389762710d41352c13b0891f2 Mon Sep 17 00:00:00 2001 From: Sindre Stephansen Date: Sun, 15 Sep 2024 23:43:48 +0200 Subject: [PATCH] Restructure memos to make them alphabetically sortable --- ynab.py | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/ynab.py b/ynab.py index 4025a74..9b3d3cb 100755 --- a/ynab.py +++ b/ynab.py @@ -5,6 +5,7 @@ import csv import re from pathlib import Path +whitelist_cards = ["7756"] def usage(): print('Usage: ynab.py ') @@ -13,6 +14,44 @@ def usage(): def is_reserved(row): return '(Reservert)' in row[1] +def convert_memo(original): + original = re.match(r'="[ ]?(.+)"', original).groups()[0] + original = original.replace(" Kurs: 1.0000", "") + words = original.split(" ") + + for i in range(20): + if words[0] == "": + # It's empty + del words[0] + elif m := re.match(r'\*(\d{4})', words[0]): + # It's the last four digits of a card + if m.groups()[0] in whitelist_cards: + # It's an expected card, ignore it + del words[0] + else: + # It's an unexpected card, move it to the end + words.append(words.pop(0)) + elif m := re.match(r'\d{2}\.\d{2}', words[0]): + # It's the date. Move it to the end + words.append(words.pop(0)) + elif (m1 := re.match(r'^[A-Z]{3}$', words[0])) and (m2 := re.match(r'[\d]+\.[\d]+', words[1])): + # It's the original currency + if words[0] == "NOK": + # It's Norwegian kroner, ignoring + del words[0] + del words[0] + else: + # It's some other currency, move it to the end + words.append(words.pop(0)) + words.append(words.pop(0)) + else: + break + else: + raise Exception(f"Infinite loop while parsing \"{original}\"") + + + return " ".join(words) + def convert(reader, writer): header = ['Date', 'Payee', 'Memo', 'Outflow', 'Inflow'] @@ -45,7 +84,7 @@ def convert(reader, writer): else: money_out = -money - memo = re.match(r'="[ ]?(.+)"', row[2]).groups()[0] + memo = convert_memo(row[2]) new_row = [*row[:2], memo, money_out, money_in] writer.writerow(new_row)