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)
```
import argparse
import collections
import argparse
import collections
import itertools
import re
from collections import namedtuple
import itertools
import re
from collections import namedtuple
-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
# last field is the value, parse as float
value = float(fields.pop().replace('.', '').replace(',', '.'))
# match on who, IBAN, type, or desc
return filter_re.search(entry.date)
with path.open() as f:
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
# 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))