comdirect reader tweak

This commit is contained in:
Mathias Schneider
2026-09-07 09:52:28 +02:00
parent dc68c79d93
commit 97c7f36735
+25 -22
View File
@@ -1,7 +1,9 @@
import csv import csv
from dataclasses import dataclass
import re import re
from enum import Enum, auto from enum import Enum, auto
from pathlib import Path from pathlib import Path
from typing import Callable
from src.models import B4wExport from src.models import B4wExport
@@ -17,42 +19,43 @@ def reader_b4w(path: Path):
def reader_comdirect(path: Path): def reader_comdirect(path: Path):
PATTERN_ACCOUNT_NAME = r'^"Umsätze ([^"]+)";"Zeitraum: .*$'
PATTERN_HEADER = r'"([^"]+)"'
PATTERN_DATA = r'"([^"]+)"'
class EXPECT_LINE(Enum): @dataclass
ACCOUNT_NAME = auto() class Pattern:
BLANK = auto() pattern: str
HEADER = auto()
DATA = auto() @classmethod
def extract_pattern(cls, txt):
return re.findall(cls.pattern, txt)
class EXPECT_LINE(Enum, Pattern):
ACCOUNT_NAME = Pattern(r'^"Umsätze ([^"]+)";"Zeitraum: .*$')
BLANK = Pattern(r"\n")
HEADER = Pattern(r'"([^"]+)"')
DATA = Pattern(r'"([^"]+)"')
with path.open(encoding="latin1") as fid: with path.open(encoding="latin1") as fid:
lines = fid.readlines() lines = fid.readlines()
expect_next = EXPECT_LINE.ACCOUNT_NAME expect_next = EXPECT_LINE.ACCOUNT_NAME
account_name = None account_name = ""
header = ""
result = {} result = {}
for line in lines: for line in lines:
if expect_next == EXPECT_LINE.ACCOUNT_NAME: parsed = expect_next.extract_pattern(line)
account_name = re.findall(PATTERN_ACCOUNT_NAME, line) if expect_next == EXPECT_LINE.ACCOUNT_NAME and parsed:
if account_name: account_name = parsed[0]
account_name = account_name[0]
result[account_name] = {} result[account_name] = {}
expect_next = EXPECT_LINE.BLANK expect_next = EXPECT_LINE.BLANK
elif expect_next == EXPECT_LINE.BLANK: elif expect_next == EXPECT_LINE.BLANK and parsed:
if line == "\n":
expect_next = EXPECT_LINE.HEADER expect_next = EXPECT_LINE.HEADER
elif expect_next == EXPECT_LINE.HEADER: elif expect_next == EXPECT_LINE.HEADER and parsed:
header = re.findall(PATTERN_HEADER, line) header = parsed
if header:
result[account_name]["data"] = [] result[account_name]["data"] = []
expect_next = EXPECT_LINE.DATA expect_next = EXPECT_LINE.DATA
elif expect_next == EXPECT_LINE.DATA: elif expect_next == EXPECT_LINE.DATA and parsed:
data = re.findall(PATTERN_DATA, line)
if data:
result[account_name]["data"].append( result[account_name]["data"].append(
{column: value for column, value in zip(header, data)} {column: value for column, value in zip(header, parsed)}
) )
expect_next = EXPECT_LINE.ACCOUNT_NAME expect_next = EXPECT_LINE.ACCOUNT_NAME
else: else: