javascript - 使用 node.js 和 ES6/ES7 功能逐行读取 CSV 文件

标签 javascript node.js csv ecmascript-6 ecmascript-2016

在 Python 中逐行读取 CSV 文件(即不将整个文件加载到内存中)很简单:

import csv
for row in csv.reader(open("file.csv")):
    print(row[0])

对 node.js 做同样的事情需要使用类似 node-csv 的东西、流和回调。

是否可以使用新的 ES6/ES7 功能(如迭代器、生成器、promises 和异步函数)以看起来更像 Python 代码的方式迭代 CSV 文件的行?

理想情况下,我希望能够写出这样的东西:

for (const row of csvOpen('file.csv')) {
  console.log(row[0]);
}

(同样,没有一次将整个文件加载到内存中。)

最佳答案

我不熟悉 node-csv,但听起来应该是使用生成器的迭代器可以做到。只需将其包装在任何异步回调 API 周围即可:

let dummyReader = {
  testFile: ["row1", "row2", "row3"],
  read: function(cb) {
    return Promise.resolve().then(() => cb(this.testFile.shift())).catch(failed);
  },
  end: function() {
    return !this.testFile.length;
  }
}

let csvOpen = url => {
  let iter = {};
  iter[Symbol.iterator] = function* () {
    while (!dummyReader.end()) {
      yield new Promise(resolve => dummyReader.read(resolve));
    }
  }
  return iter;
};

async function test() {
  // The line you wanted:
  for (let row of csvOpen('file.csv')) {
    console.log(await row);
  }
}

test(); // row1, row2, row3

var failed = e => console.log(e.name +": "+ e.message);

请注意,row 是一个 promise ,但足够接近。

粘贴到babel .

关于javascript - 使用 node.js 和 ES6/ES7 功能逐行读取 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38313873/

相关文章:

javascript - SOCKJS 对 SOCKET_CREATED 事件的回复

javascript - 如何将数组数据一页传递到另一页

javascript - 尝试为我的 Electron 应用程序创建安装程序时生成未找到错误

javascript - 将 React 组件与另一个组件包装在同一文件中

mysql - 如何使用 Windows 任务计划程序导入 CSV 或使用命令提示符计划任务

javascript - 这行代码真的可以用于检测 HTML5 支持吗?

javascript - JS 包含 URL 作为 URL 参数

javascript - 检查 JavaScript 类是否包含静态方法

python - 使用 csv.DictWriter 水平写入列表值

java - Camel 宾迪 : how to ignore last columns