comdirect reader tweak
This commit is contained in:
+33
-30
@@ -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,44 +19,45 @@ 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 and parsed:
|
||||||
elif expect_next == EXPECT_LINE.BLANK:
|
expect_next = EXPECT_LINE.HEADER
|
||||||
if line == "\n":
|
elif expect_next == EXPECT_LINE.HEADER and parsed:
|
||||||
expect_next = EXPECT_LINE.HEADER
|
header = parsed
|
||||||
elif expect_next == EXPECT_LINE.HEADER:
|
result[account_name]["data"] = []
|
||||||
header = re.findall(PATTERN_HEADER, line)
|
expect_next = EXPECT_LINE.DATA
|
||||||
if header:
|
elif expect_next == EXPECT_LINE.DATA and parsed:
|
||||||
result[account_name]["data"] = []
|
result[account_name]["data"].append(
|
||||||
expect_next = EXPECT_LINE.DATA
|
{column: value for column, value in zip(header, parsed)}
|
||||||
elif expect_next == EXPECT_LINE.DATA:
|
)
|
||||||
data = re.findall(PATTERN_DATA, line)
|
expect_next = EXPECT_LINE.ACCOUNT_NAME
|
||||||
if data:
|
|
||||||
result[account_name]["data"].append(
|
|
||||||
{column: value for column, value in zip(header, data)}
|
|
||||||
)
|
|
||||||
expect_next = EXPECT_LINE.ACCOUNT_NAME
|
|
||||||
else:
|
else:
|
||||||
expect_next = EXPECT_LINE.ACCOUNT_NAME
|
expect_next = EXPECT_LINE.ACCOUNT_NAME
|
||||||
return result
|
return result
|
||||||
|
|||||||
Reference in New Issue
Block a user