Tai Truong
fix readme
d202ada
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)