首页 > 解决方案 > 返回从 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 等。

标签: node.jsnode-csv-parse

解决方案


我已经测试了下面的代码,它会生成所需的地图。

如果我们得到一个错误,我会调用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'
}

推荐阅读