A script to convert CSV exported from Sparebanken Sør to a format YNAB can import
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

74 lignes
1.5KB

  1. #!/bin/python3
  2. import sys
  3. import csv
  4. import re
  5. from pathlib import Path
  6. def usage():
  7. print('Usage: ynab.py <filename>')
  8. def is_reserved(row):
  9. return '(Reservert)' in row[1]
  10. def convert(reader, writer):
  11. header = ['Date', 'Payee', 'Memo', 'Outflow', 'Inflow']
  12. writer.writerow(header)
  13. # Ignore header
  14. reader.__next__()
  15. for row in reader:
  16. if is_reserved(row):
  17. continue
  18. money_out = 0
  19. money_in = 0
  20. if (isinstance(row[3], str)):
  21. moneystr = row[3].replace(',', '.')
  22. try:
  23. money = float(moneystr) if moneystr else 0
  24. except ValueError as e:
  25. print(f'Error in row {row}')
  26. raise e
  27. else:
  28. money = float(row[3])
  29. if money >= 0:
  30. money_in = money
  31. else:
  32. money_out = -money
  33. memo = re.match(r'="[ ]?(.+)"', row[2]).groups()[0]
  34. new_row = [*row[:2], memo, money_out, money_in]
  35. writer.writerow(new_row)
  36. def main():
  37. if len(sys.argv) != 2:
  38. usage()
  39. exit(1)
  40. filepath = Path(sys.argv[1])
  41. new_basename = f'ynab-{filepath.name}'
  42. new_filepath = filepath.parent / new_basename
  43. with filepath.open(mode='r') as old_file:
  44. reader = csv.reader(old_file, delimiter=';')
  45. with new_filepath.open(mode='w') as new_file:
  46. writer = csv.writer(new_file)
  47. convert(reader, writer)
  48. if __name__ == '__main__':
  49. main()