import { useMemo } from "react"; import { parseDelimited } from "~/lib/csv"; const MAX_ROWS = 1000; const MAX_COLUMNS = 100; export function CsvTable({ contents, delimiter }: { contents: string; delimiter: string }) { const table = useMemo(() => { const parsed = parseDelimited(contents, delimiter, MAX_ROWS + 1); const rows = parsed.rows.map((cells, row) => ({ row, cells: cells.slice(0, MAX_COLUMNS).map((value, column) => ({ column, value })), })); return { rows, truncated: parsed.truncated }; }, [contents, delimiter]); const [header, ...body] = table.rows; return (
))} {body.slice(0, MAX_ROWS).map((row) => ( {row.cells.map((cell) => ( ))} ))}
{header?.cells.map((cell) => ( {cell.value}
{row.row} {cell.value}
{(table.truncated || body.length > MAX_ROWS) && (

Showing the first {MAX_ROWS} rows.

)}
); }