reader_comdirect (tbc)

This commit is contained in:
2026-09-06 23:21:18 +02:00
parent edb5a75bf7
commit dc68c79d93
4 changed files with 61 additions and 3 deletions
+46
View File
@@ -1,4 +1,6 @@
import csv
import re
from enum import Enum, auto
from pathlib import Path
from src.models import B4wExport
@@ -12,3 +14,47 @@ def reader_raw(path: Path):
def reader_b4w(path: Path):
raw = reader_raw(path)
return list(map(B4wExport.model_validate, raw))
def reader_comdirect(path: Path):
PATTERN_ACCOUNT_NAME = r'^"Umsätze ([^"]+)";"Zeitraum: .*$'
PATTERN_HEADER = r'"([^"]+)"'
PATTERN_DATA = r'"([^"]+)"'
class EXPECT_LINE(Enum):
ACCOUNT_NAME = auto()
BLANK = auto()
HEADER = auto()
DATA = auto()
with path.open(encoding="latin1") as fid:
lines = fid.readlines()
expect_next = EXPECT_LINE.ACCOUNT_NAME
account_name = None
result = {}
for line in lines:
if expect_next == EXPECT_LINE.ACCOUNT_NAME:
account_name = re.findall(PATTERN_ACCOUNT_NAME, line)
if account_name:
account_name = account_name[0]
result[account_name] = {}
expect_next = EXPECT_LINE.BLANK
elif expect_next == EXPECT_LINE.BLANK:
if line == "\n":
expect_next = EXPECT_LINE.HEADER
elif expect_next == EXPECT_LINE.HEADER:
header = re.findall(PATTERN_HEADER, line)
if header:
result[account_name]["data"] = []
expect_next = EXPECT_LINE.DATA
elif expect_next == EXPECT_LINE.DATA:
data = re.findall(PATTERN_DATA, line)
if data:
result[account_name]["data"].append(
{column: value for column, value in zip(header, data)}
)
expect_next = EXPECT_LINE.ACCOUNT_NAME
else:
expect_next = EXPECT_LINE.ACCOUNT_NAME
return result