123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- from jinja2 import Environment, Template
- import csv
- def split_at(value, sep, idx):
- try:
- return value.split(sep)[idx]
- except Exception:
- return ''
- class Reader:
- """
- Reader class to handle reading and processing of CSV and JSON files for mailcow.
- """
- def __init__(self):
- pass
- def read_csv(self, file_path, delimiter=',', encoding='iso-8859-1'):
- """
- Read a CSV file and return a list of dictionaries.
- Each dictionary represents a row in the CSV file.
- :param file_path: Path to the CSV file.
- :param delimiter: Delimiter used in the CSV file (default: ',').
- """
- with open(file_path, mode='r', encoding=encoding) as file:
- reader = csv.DictReader(file, delimiter=delimiter)
- reader.fieldnames = [h.replace(" ", "_") if h else h for h in reader.fieldnames]
- return [row for row in reader]
- def map_csv_data(self, data, mapping_file_path, encoding='iso-8859-1'):
- """
- Map CSV data to a specific structure based on the provided Jinja2 template file.
- :param data: List of dictionaries representing CSV rows.
- :param mapping_file_path: Path to the Jinja2 template file.
- :return: List of dictionaries with mapped data.
- """
- with open(mapping_file_path, 'r', encoding=encoding) as tpl_file:
- template_content = tpl_file.read()
- env = Environment()
- env.filters['split_at'] = split_at
- template = env.from_string(template_content)
- mapped_data = []
- for row in data:
- rendered = template.render(**row)
- try:
- mapped_row = eval(rendered)
- except Exception:
- mapped_row = rendered
- mapped_data.append(mapped_row)
- return mapped_data
|