在节点中使用 d3 读取 csv 数据的最佳实践。为啥会出现 TypeError?
Posted
技术标签:
【中文标题】在节点中使用 d3 读取 csv 数据的最佳实践。为啥会出现 TypeError?【英文标题】:Best Practices for reading csv data with d3 in node. Why gettting a TypeError?在节点中使用 d3 读取 csv 数据的最佳实践。为什么会出现 TypeError? 【发布时间】:2022-01-14 13:58:29 【问题描述】:我正在尝试在节点环境中读取带有 d3
的 csv 文件。因此,我有点困惑“最佳实践”方式是什么以及为什么我继续获得TypeError
。
我知道对于d3
的某些模块,必须存在支持fetch
的环境。因此,我现在的代码如下所示:
import * as d3 from "d3";
import fetch from "node-fetch";
global.fetch = fetch;
let data_path = "flightCodes.csv";
// would a d3.csvParse(fs.readFileSync(data_path)) be better?
let data = await d3.csv(data_path, function (err, dat)
if (err)
console.log(err);
else
console.log(dat);
);
console.log(data);
csv 文件位于同一文件夹中,如下所示:
orig,dest,orig_codes,dest_codes
Paris,Lyon,"BVA, ORY, CDG",LYS
Paris,Bordeaux,"BVA, ORY, CDG",BOD
Paris,Nantes,"BVA, ORY, CDG",NTE
Madrid,Barcelona,MAD,BCN
Lisboa,Porto,LIS,OPO
我的package.json
看起来像这样:
"name": "name",
"version": "1.0.0",
"description": "",
"type": "module",
"scripts":
"test": "echo \"Error: no test specified\" && exit 1"
,
"keywords": [],
"author": "",
"license": "ISC",
"dependencies":
"d3": "^7.2.0",
"d3-fetch": "^3.0.1",
"node-fetch": "^3.1.0"
当我执行node script.js
时,我得到以下信息,但我不完全明白为什么。有人可能有想法吗?
node:internal/errors:464
ErrorCaptureStackTrace(err);
^
TypeError [ERR_INVALID_URL]: Invalid URL
at new NodeError (node:internal/errors:371:5)
at onParseError (node:internal/url:552:9)
at parse (<anonymous>)
at new URL (node:internal/url:632:5)
【问题讨论】:
【参考方案1】:如果您引用的文件无法通过 URL 访问,则 d3.csv
(使用 fetch)无法找到它。在内部,d3.csv
fetches the data 然后调用d3.csvParse
来解析它,所以你也可以这样做!
let data = d3.csvParse(fs.readFileSync(data_path));
此外,您的代码还有另一个问题。签名 d3.csv(path, callback)
已弃用。相反,它将在每一行上执行第二个参数作为解析函数。正确的调用方式是d3.csv(path).then(callback)
或
const data = await d3.csv(path);
callback(data);
【讨论】:
非常感谢!我只是想知道为什么它找不到文件......它在同一个目录中。现在我收到了TypeError: Only absolute URLs are supported
。以上是关于在节点中使用 d3 读取 csv 数据的最佳实践。为啥会出现 TypeError?的主要内容,如果未能解决你的问题,请参考以下文章