在节点中使用 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.csvfetches 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?的主要内容,如果未能解决你的问题,请参考以下文章

d3 csv在回调后丢弃数据

在 D3 中读取没有标题行的 csv/tsv

如何使用 d3 v4 读取 CSV?

最佳实践:使用 PHP 5.x 将 CSV 导入 MYSQL 数据库

Parquet 文件上 groupby 的最佳实践

检查plpgsql中是不是存在变量的最佳实践?