From: Martin Pitt Date: Sun, 10 Dec 2023 14:40:15 +0000 (+0100) Subject: consors-report.py: Convert to comma separated input X-Git-Url: https://piware.de/gitweb/?a=commitdiff_plain;h=6da88a57b007c9;p=bin.git 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) ``` --- 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():