在 TypeScript 中处理 CSV:库、解析与数据生成

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 TypeScript 中处理 CSV:完整指南



CSV(逗号分隔值)是交换表格数据最常用的格式之一。在 TypeScript 生态系统中,有多个成熟的库支持高效地解析、生成和转换 CSV 文件,并提供完整的类型支持。在本文中,我们将介绍三个主要工具:csv-parse、csv-stringify 和 papaparse,并通过实际示例讲解其用法。



1. csv-parse 库:带类型化的 CSV 解析



csv-parse 是 csv.js 生态系统的一部分,是最高效的 CSV 解析库之一。它支持流式处理、自定义分隔符,并通过 TypeScript 提供严格的类型化支持。



安装:

npm install csv-parsenpm install @types/csv-parse  // 用于 TypeScript(如果未自动包含)


解析 CSV 字符串示例:

import { parse } from 'csv-parse/sync';import { stringify } from 'csv-stringify/sync';

interface User { id: number; name: string; email: string; age: number;}

const csvData = `id,name,email,age1,伊万·伊万诺夫,ivan@example.com,302,玛丽亚·彼得罗娃,maria@example.com,253,阿列克谢·斯米尔诺夫,alex@example.com,35`;

// 显式指定类型进行解析const records: User[] = parse(csvData, { columns: true, // 第一行为标题行 skip_empty_lines: true, delimiter: ',', cast: true // 自动类型转换(字符串转数字)});

console.log(records);// [// { id: 1, name: '伊万·伊万诺夫', email: 'ivan@example.com', age: 30 },// { id: 2, name: '玛丽亚·彼得罗娃', email: 'maria@example.com', age: 25 },// { id: 3, name: '阿列克谢·斯米尔诺夫', email: 'alex@example.com', age: 35 }// ]


2. csv-stringify 库:从对象生成 CSV



csv-stringify 是一个配套库,用于从对象数组或元组生成 CSV 字符串和文件。非常适合数据导出。



生成 CSV 示例:

import { stringify } from 'csv-stringify/sync';

interface Product { sku: string; price: number; stock: number;}

const products: Product[] = [ { sku: 'PRD-001', price: 1500, stock: 10 }, { sku: 'PRD-002', price: 2500, stock: 5 }, { sku: 'PRD-003', price: 800, stock: 20 },];

const csvOutput = stringify(products, { header: true, columns: ['sku', 'price', 'stock'], // 字段顺序与过滤});

console.log(csvOutput);// sku,price,stock// PRD-001,1500,10// PRD-002,2500,5// PRD-003,800,20


3. PapaParse 库:适用于浏览器和 Node.js 的通用解析器



PapaParse 是 JavaScript/TypeScript 中最流行的 CSV 处理库。它既可在浏览器中运行,也可在 Node.js 中运行,支持通过流处理大文件、自动检测分隔符以及错误处理。



安装:

npm install papaparsenpm install @types/papaparse


在 Node.js 中处理文件示例:

import fs from 'fs';import Papa from 'papaparse';

interface Transaction { date: string; amount: number; category: string;}

const fileContent = fs.readFileSync('transactions.csv', 'utf-8');

const result = Papa.parse<Transaction>(fileContent, { header: true, dynamicTyping: true, // 自动类型转换 skipEmptyLines: true,});

if (result.errors.length > 0) { console.error('解析错误:', result.errors);} else { console.log('交易记录:', result.data); // result.data — Transaction 对象数组}

// 使用流异步解析大文件const stream = fs.createReadStream('large-file.csv');Papa.parse(stream,

推荐