如何在Deno中使用BufReader导入竖线分隔的文本文件?
问题分析与解决
你的代码返回空数组主要有两个核心原因:
1. std库版本不兼容
你使用的csv.parse是std@0.82.0版本,而BufReader是std@0.166.0版本,两个版本跨度极大,API接口存在不兼容问题,旧版的parseCsv无法正确处理新版BufReader的输入流。
2. 大文件解析方式错误
针对大文件,新版std/csv的parse方法返回的是异步迭代器,而非直接返回完整数组,需要通过循环迭代来读取每一行数据,而不是直接await获取结果。
修正后的代码
// 统一使用相同版本的std库 import { parse as parseCsv } from "https://deno.land/std@0.166.0/encoding/csv.ts"; import { BufReader } from "https://deno.land/std@0.166.0/io/mod.ts"; const file = await Deno.open("data/test.csv"); const reader = new BufReader(file); // 获取异步迭代器 const csvIterator = parseCsv(reader, { skipFirstRow: true, separator: "|", }); const content = []; // 迭代读取每一行数据 for await (const row of csvIterator) { content.push(row); // 这里可以直接将row写入SQLite,无需等待全部数据加载完成 } console.log(content); file.close(); // 记得关闭文件句柄
关键说明
- 必须保证所有std库模块使用同一版本,避免API不兼容问题;
- 大文件场景下,用
for await...of迭代处理每一行,既能减少内存占用,也符合流式解析的设计逻辑; - 处理完成后记得关闭文件句柄,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Dycey
相关产品推荐
相关产品推荐

