在 TypeScript 中处理 CSV:完整指南
CSV(逗号分隔值)是交换表格数据最流行的格式之一。在 TypeScript(和 JavaScript)中,有多个强大的库可用于解析、生成和处理 CSV 文件。本文将介绍主要工具、它们的功能,并提供实际示例。
为什么要使用 CSV 库?
JavaScript 的内置方法(例如 split(','))无法处理复杂情况:
- 字段内转义的引号和逗号
- 不同的分隔符(分号、制表符)
- 不同的编码和 BOM
- 多行值
- 不同的行尾类型(CRLF、LF)
专业的库可以解决所有这些问题,并提供便捷的 API 来处理数据。
1. csv-parse — 在 Node.js 和浏览器中解析 CSV
csv-parse 是 csv.js 生态系统的一部分,是最流行的解析库之一。它既可以在 Node.js 中使用,也可以在浏览器中(通过打包工具)使用。
安装
npm install csv-parseTypeScript 使用示例
import { parse } from 'csv-parse/sync';import { readFileSync } from 'fs';
interface User { id: number; name: string; email: string;}
const csvData = readFileSync('users.csv', 'utf-8');const records: User[] = parse(csvData, { columns: true, // 第一行为标题 skip_empty_lines: true, delimiter: ',', cast: (value, context) => { if (context.column === 'id') return parseInt(value, 10); return value; }});
console.log(records);2. PapaParse — 适用于浏览器和 Node.js 的通用解析器
PapaParse 是一个库,具有出色的对大文件的支持(流式处理)、自动分隔符检测和广泛的配置选项。
安装
npm install papaparse带结果类型化的示例
import Papa from 'papaparse';
interface Product { sku: string; price: number; quantity: number;}
const csvString = `sku,price,quantityABC-001,29.99,100ABC-002,49.50,50`;
const result = Papa.parse<Product>(csvString, { header: true, dynamicTyping: true, // 自动类型转换 skipEmptyLines: true});
if (result.errors.length > 0) { console.error('解析错误:', result.errors);} else { result.data.forEach(product => { console.log(`商品 ${product.sku}: ${product.price} 卢布`); });}3. csv-stringify — 从数据生成 CSV
对于反向任务——从对象数组创建 CSV——请使用 csv-stringify。它也是 csv.js 生态系统的一部分。
安装
npm install csv-stringify生成 CSV 示例
import { stringify } from 'csv-stringify/sync';import { writeFileSync } from 'fs';
interface Order { orderId: number; customer: string; total: number;}
const orders: Order[] = [ { orderId: 1001, customer: '伊万·彼得罗夫', total: 1500.50 }, { orderId: 1002, customer: '玛丽亚·西多罗娃', total: 2300.00 }, { orderId: 1003, customer: '阿列克谢·伊万诺夫', total: 890.75 }];
const csvOutput = stringify(orders, { header: true, columns: ['orderId', 'customer', 'total']});
writeFileSync('orders.csv', csvOutput, 'utf-8');console.log('CSV 文件创建成功');4. 错误处理与数据验证
处理 CSV 时,正确进行错误处理非常重要。来看一个数据验证的示例:
import Papa from 'papaparse';
interface ValidatedRow { isValid: boolean; errors: s