CSV parser
retab-ui/csvFreeUtility
A small, dependency-free RFC 4180-ish CSV/TSV parser returning a header and rectangular rows.
Install it
npx shadcn@latest add https://ui.retab.com/r/csv.jsonSource
1import {2 createCsvNormalizer,3 padRowsToColumnCount,4 type CsvNormalizer,5} from "./csv-normalizer";6import { createCsvParser } from "./csv-parser";78export {9 DEFAULT_CSV_DIALECT,10 extensionOfDelimitedName,11 inferCsvDialect,12 isTabDelimited,13 normalizeCsvDelimiter,14 resolveCsvDialect,15 type CsvDialect,16 type CsvDialectDescriptor,17} from "./csv-dialect";18export {19 createCsvNormalizer,20 padRowsToColumnCount,21 type CsvNormalizer,22 type CsvNormalizerOptions,23 type CsvTable,24 type CsvTableEvent,25} from "./csv-normalizer";26export {27 createCsvParser,28 type CsvParser,29 type CsvParserOptions,30} from "./csv-parser";3132export interface ParsedCsv {33 columns: string[];34 rows: string[][];35}3637export interface ParseCsvOptions {38 /** Field delimiter. Defaults to ",". */39 delimiter?: string;40 /** Treat the first record as a header row. Defaults to true. */41 hasHeader?: boolean;42}4344export function parseCsv(45 input: string,46 options: ParseCsvOptions = {},47): ParsedCsv {48 const parser = createCsvParser({ delimiter: options.delimiter });49 const normalizer = createCsvNormalizer({ hasHeader: options.hasHeader });50 const rows: string[][] = [];51 let columns: string[] = [];5253 handleCsvRecords(parser.push(input), normalizer, rows, (nextColumns) => {54 columns = nextColumns;55 padRowsToColumnCount(rows, columns.length);56 });57 handleCsvRecords(parser.flush(), normalizer, rows, (nextColumns) => {58 columns = nextColumns;59 padRowsToColumnCount(rows, columns.length);60 });6162 return { columns, rows };63}6465function handleCsvRecords(66 records: string[][],67 normalizer: CsvNormalizer,68 rows: string[][],69 onColumns: (columns: string[]) => void,70) {71 for (const record of records) {72 for (const event of normalizer.accept(record)) {73 if (event.type === "columns") {74 onColumns(event.columns);75 } else {76 rows.push(event.row);77 }78 }79 }80}8182/** Pad a record to a fixed width. */83export function fitRow(row: string[], width: number): string[] {84 if (row.length === width) return row;85 if (row.length < width)86 return [...row, ...Array(width - row.length).fill("")];87 return row;88}8990export interface CsvStreamHandlers {91 onColumns: (columns: string[]) => void;92 onRows: (rows: string[][]) => void;93 onDone?: () => void;94 onError?: (error: unknown) => void;95}9697export interface CsvStreamOptions extends ParseCsvOptions {98 /** Rows per batch handed to `onRows`. Defaults to 2000. */99 batchSize?: number;100// … truncated
Files it writes
More from retab-ui
All 130 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Document source modeldocument-source | retab-ui | Utilities | Free | no deps | |
| DOCX Document Resourcedocx-document-resource | retab-ui | Utilities | Free | no deps · 5 files | |
| Effect Keyeffect-key | retab-ui | Utilities | Free | no deps | |
| PDF Document Resourcepdf-document-resource | retab-ui | Utilities | Free | 1 dep · 6 files | |
| Segment Interactionsegment-interaction | retab-ui | Utilities | Free | no deps | |
| Segments modelsegments | retab-ui | Utilities | Free | no deps | |
| Utilsutils | retab-ui | Utilities | Free | 2 deps | |
| XLSX SheetJS flattenerxlsx-sheetjs-flattener | retab-ui | Utilities | Free | 1 dep |
