Working with CSV in TypeScript
Updated May 9, 2026
Comprehensive CSV file handling with automatic format detection, advanced header processing, and high-performance data operations.
Installation
npm install fairspecGetting Started
The CSV plugin provides these capabilities:
loadCsvTable- Load CSV/TSV files into tablessaveCsvTable- Save tables to CSV/TSV filesCsvPlugin- Plugin for framework integration
For example:
import { loadCsvTable } from "fairspec"
const table = await loadCsvTable({ data: "table.csv" })
// the column types will be automatically inferred
// or you can provide a Table SchemaBasic Usage
Loading CSV Files
import { loadCsvTable } from "fairspec"
// Load a simple CSV file
const table = await loadCsvTable({ data: "data.csv" })
// Load with custom format
const table = await loadCsvTable({
data: "data.csv",
format: {
name: "csv",
delimiter: ";",
headerRows: [1],
},
})
// Load multiple CSV files (concatenated)
const table = await loadCsvTable({
data: ["part1.csv", "part2.csv", "part3.csv"],
})Saving CSV Files
import { saveCsvTable } from "fairspec"
// Save with default options
await saveCsvTable(table, { path: "output.csv" })
// Save with custom format
await saveCsvTable(table, {
path: "output.csv",
format: {
name: "csv",
delimiter: "\t",
quoteChar: "'",
},
})
// Save as TSV
await saveCsvTable(table, {
path: "output.tsv",
format: { name: "tsv" },
})Automatic Format Detection
import { loadCsvTable } from "fairspec"
// Format is automatically detected when not specified
const table = await loadCsvTable({ data: "unknown-dialect.csv" })
// The CSV plugin will automatically infer delimiter, quote characters, etc.
// You can also explicitly specify the format if detection isn't accurate
const table = await loadCsvTable({
data: "data.csv",
format: {
name: "csv",
delimiter: ",",
quoteChar: '"',
headerRows: [1],
},
})Advanced Features
Multi-Header Row Processing
// CSV with multiple header rows:
// Year,2023,2023,2024,2024
// Quarter,Q1,Q2,Q1,Q2
// Revenue,100,120,110,130
const table = await loadCsvTable({
data: "multi-header.csv",
format: {
name: "csv",
headerRows: [1, 2],
headerJoin: "_",
},
})
// Resulting columns: ["Year_Quarter", "2023_Q1", "2023_Q2", "2024_Q1", "2024_Q2"]Comment Row Handling
// CSV with comment rows:
// # This is a comment
// # Generated on 2024-01-01
// Name,Age,City
// John,25,NYC
const table = await loadCsvTable({
data: "with-comments.csv",
format: {
name: "csv",
commentRows: [1, 2],
headerRows: [3],
},
})
// Or use commentPrefix to skip lines starting with a specific character
const table = await loadCsvTable({
data: "with-comments.csv",
format: {
name: "csv",
commentPrefix: "#",
headerRows: [1],
},
})Remote File Loading
// Load from URL
const table = await loadCsvTable({
data: "https://example.com/data.csv",
})
// Load multiple remote files
const table = await loadCsvTable({
data: [
"https://api.example.com/data-2023.csv",
"https://api.example.com/data-2024.csv",
],
})Created with ❤ and Livemark