node.js - 返回从 CSV 解析器创建的字典
问题描述
我正在尝试从 csv 文件中提取像 {Name:Value, Name2:Value2,...} 这样的字典数据,如下所示
<metadata>
<metadata>
<metadata>
<metadata>
ID,1,2,3,4,5,6,...
Name,ABC,BCD,CDE,DEF,EFG,FGH,...
Val,123,234,345,456,567,678,...
使用下面的功能
async function getMap(file) {
rv = {};
fs.createReadStream(file)
.pipe(csv.parse({from_line: 5, to_line:7, columns: true, bom: true}, (err, data) => {
for(i=1;i<=200;i++) {
rv[data[0][i]] = data[1][i];
}
}));
return rv;
}
我认为这会返回如下内容:
{'ABC':123,'BCD':234,...}
但是空值是返回的。我确定这与范围有关(如果这是正确的词),但还无法弄清楚。
==============================
最初我认为这是与范围有关的事情,但我更多地研究了结果,它更多的是我不了解的异步问题。这怎么能等待 readStream 处理到文件末尾,使用 await、promise、resolve 等。
解决方案
我已经测试了下面的代码,它会生成所需的地图。
如果我们得到一个错误,我会调用reject(err),所以这应该被正确传播。如果解析成功,我们将使用所需的映射调用 resolve。
const csv = require('csv');
const fs = require("fs");
function getMap(file) {
return new Promise((resolve, reject) => {
fs.createReadStream(file)
.pipe(csv.parse({from_line: 6, to_line: 7, columns: true, bom: true}, (err, data) => {
if (err) {
reject(err);
} else {
resolve(data[0]);
}
}));
})
}
async function testGetMap() {
try {
const map = await getMap("./map-input.csv");
console.log("testGetMap: map:")
console.table(map);
} catch (error) {
console.error("testGetMap: An error occurred:", error);
}
}
testGetMap();
地图输入.csv
<metadata>
<metadata>
<metadata>
<metadata>
ID,1,2,3,4,5,6,...
Name,ABC,BCD,CDE,DEF,EFG,FGH
Val,123,234,345,456,567,678
输出如下所示:
{
Name: 'Val',
ABC: '123',
BCD: '234',
CDE: '345',
DEF: '456',
EFG: '567',
FGH: '678'
}
推荐阅读
- java - 如何在 Eclipse JDK 首选项部分中设置默认的 JDK 合规性级别和版本
- react-native - 如何修复 NativeModule.RNLocalize 为空?
- angular - Angular Universal 不在服务器端加载字体
- jquery - 如何在 Odoo PoS 屏幕中将客户列表显示为弹出窗口?
- c# - 如何使用 C# 中的参数运行 rscript
- node.js - 使用 MongoDB 聚合 $sample 不会给出考虑整个文档集合的随机结果
- sql - 产品视图按优先级排序
- c++ - cmake:动态作业池更改
- c# - .Net Core 3.1 可以针对 WCF tcp mex 创建连接的客户端吗?
- r - 计算空间字符串列的总和