【问题标题】:Returning dictionary created from CSV parser返回从 CSV 解析器创建的字典
【发布时间】:2021-07-09 05:10:04
【问题描述】:

我正在尝试从 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.js node-csv-parse


    【解决方案1】:

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

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

    ma​​p-input.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'
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-20
      • 2016-09-03
      • 2011-10-08
      • 2012-12-15
      • 2021-02-20
      • 2012-01-02
      • 2016-11-22
      相关资源
      最近更新 更多