]> piware.de Git - bin.git/commitdiff
consors-report.py: Convert to comma separated input
authorMartin Pitt <martin@piware.de>
Sun, 10 Dec 2023 14:40:15 +0000 (15:40 +0100)
committerMartin Pitt <martin@piware.de>
Sun, 10 Dec 2023 14:49:14 +0000 (15:49 +0100)
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

index 89b24c12d87e89b90ce959119de53042546bca14..c3d505d0e10a342434fd6fc6b810ca36ea28d37c 100755 (executable)
@@ -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():