import csv import io from pathlib import Path from langflow.custom import Component from langflow.io import FileInput, MessageTextInput, MultilineInput, Output from langflow.schema import Data class CSVToDataComponent(Component): display_name = "Load CSV" description = "Load a CSV file, CSV from a file path, or a valid CSV string and convert it to a list of Data" icon = "file-spreadsheet" name = "CSVtoData" legacy = True inputs = [ FileInput( name="csv_file", display_name="CSV File", file_types=["csv"], info="Upload a CSV file to convert to a list of Data objects", ), MessageTextInput( name="csv_path", display_name="CSV File Path", info="Provide the path to the CSV file as pure text", ), MultilineInput( name="csv_string", display_name="CSV String", info="Paste a CSV string directly to convert to a list of Data objects", ), ] outputs = [ Output(name="data_list", display_name="Data List", method="load_csv_to_data"), ] def load_csv_to_data(self) -> list[Data]: if sum(bool(field) for field in [self.csv_file, self.csv_path, self.csv_string]) != 1: msg = "Please provide exactly one of: CSV file, file path, or CSV string." raise ValueError(msg) csv_data = None try: if self.csv_file: resolved_path = self.resolve_path(self.csv_file) file_path = Path(resolved_path) if file_path.suffix.lower() != ".csv": self.status = "The provided file must be a CSV file." else: with file_path.open(newline="", encoding="utf-8") as csvfile: csv_data = csvfile.read() elif self.csv_path: file_path = Path(self.csv_path) if file_path.suffix.lower() != ".csv": self.status = "The provided file must be a CSV file." else: with file_path.open(newline="", encoding="utf-8") as csvfile: csv_data = csvfile.read() else: csv_data = self.csv_string if csv_data: csv_reader = csv.DictReader(io.StringIO(csv_data)) result = [Data(data=row) for row in csv_reader] if not result: self.status = "The CSV data is empty." return [] self.status = result return result except csv.Error as e: error_message = f"CSV parsing error: {e}" self.status = error_message raise ValueError(error_message) from e except Exception as e: error_message = f"An error occurred: {e}" self.status = error_message raise ValueError(error_message) from e # An error occurred raise ValueError(self.status)