import csv import io import re PAN_RE = re.compile(r"^[A-Z]{5}[0-9]{4}[A-Z]$") GSTIN_RE = re.compile(r"^[0-9]{2}[A-Z]{5}[0-9]{4}[A-Z][1-9A-Z]Z[0-9A-Z]$") TAN_RE = re.compile(r"^[A-Z]{4}[0-9]{5}[A-Z]$") MOBILE_RE = re.compile(r"^[6-9][0-9]{9}$") PIN_RE = re.compile(r"^[0-9]{6}$") def normalize_text(value): if value is None: return None text = str(value).strip() return text or None def normalize_upper(value): value = normalize_text(value) return value.upper() if value else None def build_csv(rows, headers): output = io.StringIO() writer = csv.writer(output) writer.writerow(headers) for row in rows: writer.writerow(row) return output.getvalue()