From 6da88a57b007c9abf88e82df8cf513bfba397593 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Sun, 10 Dec 2023 15:40:15 +0100 Subject: [PATCH] consors-report.py: Convert to comma separated input Consorsbank changed its format from semicolon separator without quotes to comma separator with quotes. Move to the `csv` stdlib module for that. Convert old to new format with: ```py import csv import sys with open(sys.argv[1], 'r') as csvfile: reader = csv.reader(csvfile, delimiter=';', quotechar='"') writer = csv.writer(sys.stdout, delimiter=',', quotechar='"') for row in reader: writer.writerow(row) ``` --- consors-report.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/consors-report.py b/consors-report.py index 89b24c1..c3d505d 100755 --- a/consors-report.py +++ b/consors-report.py @@ -2,6 +2,7 @@ import argparse import collections +import csv import itertools import re from collections import namedtuple @@ -44,8 +45,8 @@ def get_category(item: str) -> str: return 'Sonstiges' -def parse_entry(line: str) -> Entry: - fields = [f.strip() for f in line.strip().split(';')] +def parse_entry(raw_fields: Iterable[str]) -> Entry: + fields = [f.strip() for f in raw_fields] # last field is the value, parse as float value = float(fields.pop().replace('.', '').replace(',', '.')) # match on who, IBAN, type, or desc @@ -63,9 +64,12 @@ def parse_csv(path: Path, date_filter: str) -> Iterable[Entry]: return filter_re.search(entry.date) with path.open() as f: + reader = csv.reader(f) + next(reader) # skip header # first line is the column headers, chop it off - entries = map(parse_entry, f.readlines()[1:]) - return filter(filter_entry, entries) + entries = map(parse_entry, reader) + # do the actual iteration here, as the files get closed afterwards + return list(filter(filter_entry, entries)) def main(): -- 2.39.2