import csv
from typing import List, Dict, Callable, Optional
from pathlib import Path
class CSVProcessor:
def __init__(self, filepath: str, delimiter: str = ','):
self.filepath = Path(filepath)
self.delimiter = delimiter
self.data: List[Dict[str, str]] = []
def read(self) -> 'CSVProcessor':
"""Read CSV file into memory."""
with open(self.filepath, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f, delimiter=self.delimiter)
self.data = list(reader)
return self
def filter(self, condition: Callable[[Dict[str, str]], bool]) -> 'CSVProcessor':
"""Filter rows based on condition function."""
self.data = [row for row in self.data if condition(row)]
return self
def transform(self, column: str, func: Callable[[str], str]) -> 'CSVProcessor':
"""Transform values in a column."""
for row in self.data:
if column in row:
row[column] = func(row[column])
return self
def get_data(self) -> List[Dict[str, str]]:
"""Return processed data."""
return self.data
def write(self, output_path: str) -> None:
"""Write processed data to CSV file."""
if not self.data:
return
with open(output_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=self.data[0].keys(), delimiter=self.delimiter)
writer.writeheader()
writer.writerows(self.data)