csv.py: allow for multiline values
This commit is contained in:
		@@ -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)])
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user