From 575788ec9ad8795ec60174679cbac7a425027444 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Sat, 29 Apr 2023 01:29:10 +0200 Subject: [PATCH] csv.py: allow for multiline values --- wgmaster/csv.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/wgmaster/csv.py b/wgmaster/csv.py index aeb795f..151c37f 100644 --- a/wgmaster/csv.py +++ b/wgmaster/csv.py @@ -7,6 +7,8 @@ import datetime RE_INT = re.compile(r'-?[0-9]+') RE_FLOAT = re.compile(r'-?[0-9]+\.[0-9]+') +RE_STR_START = re.compile(r'.*;"[^"]*$') +RE_STR_END = re.compile(r'^[^"]*";.*') def cast_value(value: str) -> Any: @@ -73,7 +75,18 @@ def parse(filename: str) -> Iterator[Tuple]: with open(filename, 'r', encoding='utf-8') as f: lines = f.__iter__() yield tuple([part.strip() for part in next(lines).split(';')]) - for line in lines: + in_str = False + for cur_line in lines: + if in_str: + line += cur_line + if not RE_STR_END.match(cur_line): + continue + in_str = False + else: + line = cur_line + if RE_STR_START.match(cur_line): + in_str = True + continue yield tuple([cast_value(part) for part in parse_line(line)])