csv 如何使用BufReader从Deno中的竖线分隔文本文件导入?

b1zrtrql  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(159)

我试图将一个管道分隔的文件读入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循环?

nukf8bse

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
第一次

相关问题