| 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 |
|
|
| |
| raise ValueError(self.status) |
|
|