我试图将一个管道分隔的文件读入Deno(在将其存储到SQLite数据库之前),我遇到了一个理解问题。我想我应该在尝试让管道工作之前,尝试让一个简单的解析工作。
下面是data/test.csv
文件:
name|age
Bob|53
Alice|47
下面是我的初始代码:
import { parse as parseCsv } from "https://deno.land/std@0.82.0/encoding/csv.ts";
const content = await parseCsv(await Deno.readTextFile("data/test.csv"), {
skipFirstRow: true,
separator: "|",
});
console.log(content);
我用deno run --allow-read db.js
运行它,它返回预期的结果:
[ { name: "Bob", age: "53" }, { name: "Alice", age: "47" } ]
但是,我担心源数据可能会变得非常大,所以我希望使用BufReader:
import { parse as parseCsv } from "https://deno.land/std@0.82.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 content = await parseCsv(new BufReader(file), {
skipFirstRow: true,
separator: "|",
});
console.log(content);
但我得到的结果很简单:[]
.
有没有什么明显的东西我错过了?某种while
循环?
1条答案
按热度按时间nukf8bse1#
Deno在它的
std
库中包含了一个扩展原生TransformStream
的类,可以用来解析和迭代CSV格式的ReadableStream
。这提供了不仅能够解析文件流,而且能够解析任何其他流(例如对网络请求的流响应)的好处。该类名为
CsvStream
,从https://deno.land/std@{STD_VERSION}/encoding/csv/stream.ts
处的模块导出。以下链接指向我在编写此答案时std库当前版本中的行号:
https://deno.land/std@0.166.0/encoding/csv/stream.ts?source#L42
下面是一个基本示例,说明如何将它与问题中的示例文件一起使用。
./db.ts
:第一个
当然,你可以修改上面的例子,使其包含一个选项,如果你需要标题的话,可以单独解析第一行,然后使用解析后的标题行的值作为键,为后面的每一行生成一个对象,并将数组中的值赋给对象的相应键。下面是一个使用重载函数签名的例子:
./db.ts
:第一次