.claude/skills/ts-csv-parse/SKILL.md
Parse and generate CSV files with the csv package — stream large files, handle custom delimiters, transform records, validate data, and generate CSV output from objects. Use when tasks involve data import/export, ETL pipelines, processing uploaded CSV files, or generating downloadable reports.
npx skillsauth add eliferjunior/Claude csv-parseInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Parse and stringify CSV data. Streaming architecture handles files of any size.
# Install the csv package (includes parse, stringify, transform, generate).
npm install csv
# Or install individual packages:
npm install csv-parse csv-stringify
// src/csv/parse-file.ts — Read a CSV file and convert rows to objects.
// Uses the header row as keys for each record object.
import { parse } from "csv-parse";
import fs from "fs";
export async function parseCsvFile(filePath: string): Promise<Record<string, string>[]> {
const records: Record<string, string>[] = [];
const parser = fs.createReadStream(filePath).pipe(
parse({
columns: true, // use first row as headers
skip_empty_lines: true,
trim: true,
})
);
for await (const record of parser) {
records.push(record);
}
return records;
}
// src/csv/parse-string.ts — Parse CSV data from a string (e.g., API response body).
import { parse } from "csv-parse/sync";
export function parseCsvString(csvData: string) {
return parse(csvData, {
columns: true,
skip_empty_lines: true,
cast: true, // auto-cast numbers and booleans
cast_date: true, // auto-cast ISO date strings
});
}
// src/csv/stringify.ts — Convert objects to CSV strings for download or file export.
import { stringify } from "csv-stringify/sync";
interface SalesRow {
product: string;
revenue: number;
units: number;
date: string;
}
export function generateCsv(data: SalesRow[]): string {
return stringify(data, {
header: true,
columns: [
{ key: "product", header: "Product Name" },
{ key: "revenue", header: "Revenue ($)" },
{ key: "units", header: "Units Sold" },
{ key: "date", header: "Date" },
],
});
}
// src/csv/stream.ts — Process million-row CSV files without loading into memory.
// Transform each record as it streams through.
import { parse } from "csv-parse";
import { stringify } from "csv-stringify";
import { transform } from "stream-transform";
import fs from "fs";
export function transformCsv(inputPath: string, outputPath: string) {
fs.createReadStream(inputPath)
.pipe(parse({ columns: true }))
.pipe(
transform((record: any) => ({
name: record.name.toUpperCase(),
email: record.email.toLowerCase(),
total: Number(record.price) * Number(record.quantity),
}))
)
.pipe(stringify({ header: true }))
.pipe(fs.createWriteStream(outputPath));
}
// src/csv/delimiters.ts — Handle TSV files, semicolon-separated, or pipe-delimited.
import { parse } from "csv-parse/sync";
// Tab-separated values
const tsvData = "name\tage\tcity\nAlice\t30\tPrague";
const tsvRecords = parse(tsvData, { columns: true, delimiter: "\t" });
// Semicolon-separated (common in European exports)
const csvData = "name;age;city\nAlice;30;Prague";
const csvRecords = parse(csvData, { columns: true, delimiter: ";" });
// src/csv/validate.ts — Validate CSV records during parsing and collect errors.
import { parse } from "csv-parse";
import fs from "fs";
interface ValidationError {
line: number;
field: string;
message: string;
}
export async function validateCsv(
filePath: string,
requiredFields: string[]
): Promise<{ valid: any[]; errors: ValidationError[] }> {
const valid: any[] = [];
const errors: ValidationError[] = [];
const parser = fs.createReadStream(filePath).pipe(
parse({ columns: true, skip_empty_lines: true })
);
let line = 1;
for await (const record of parser) {
line++;
let hasError = false;
for (const field of requiredFields) {
if (!record[field] || record[field].trim() === "") {
errors.push({ line, field, message: `Missing required field: ${field}` });
hasError = true;
}
}
if (!hasError) valid.push(record);
}
return { valid, errors };
}
// src/csv/api.ts — API endpoint that generates and streams a CSV download.
import { stringify } from "csv-stringify";
import type { Request, Response } from "express";
export function handleCsvExport(req: Request, res: Response, data: any[]) {
res.setHeader("Content-Type", "text/csv");
res.setHeader("Content-Disposition", "attachment; filename=export.csv");
const stringifier = stringify({ header: true });
stringifier.pipe(res);
for (const row of data) {
stringifier.write(row);
}
stringifier.end();
}
development
Expert guidance for Fireworks AI, the platform for running open-source LLMs (Llama, Mixtral, Qwen, etc.) with enterprise-grade speed and reliability. Helps developers integrate Fireworks' inference API, fine-tune models, and deploy custom model endpoints with function calling and structured output support.
development
Convert any website into clean, structured data with Firecrawl — API-first web scraping service. Use when someone asks to "turn a website into markdown", "scrape website for LLM", "Firecrawl", "extract website content as clean text", "crawl and convert to structured data", or "scrape website for RAG". Covers single-page scraping, full-site crawling, structured extraction, and LLM-ready output.
tools
Expert guidance for Firebase, Google's platform for building and scaling web and mobile applications. Helps developers set up authentication, Firestore/Realtime Database, Cloud Functions, hosting, storage, and analytics using Firebase's SDK and CLI.
development
When the user needs to build file upload functionality for a web application. Use when the user mentions "file upload," "image upload," "upload endpoint," "multipart upload," "presigned URL," "S3 upload," "file validation," "upload to cloud storage," or "accept user files." Handles upload endpoints, file validation (type, size, magic bytes), cloud storage integration, and upload status tracking. For image/video processing after upload, see media-transcoder.