dan*_*nvk 5 javascript csv node.js ecmascript-6 ecmascript-2016
在 Python 中逐行读取 CSV 文件(即无需将整个文件加载到内存中)很简单:
import csv
for row in csv.reader(open("file.csv")):
print(row[0])
Run Code Online (Sandbox Code Playgroud)
对 node.js 进行同样的操作涉及使用诸如node-csv、流和回调之类的东西。
是否可以使用新的 ES6/ES7 功能(例如迭代器、生成器、promise 和异步函数)以看起来更像 Python 代码的方式迭代 CSV 文件的行?
理想情况下,我希望能够写出这样的东西:
for (const row of csvOpen('file.csv')) {
console.log(row[0]);
}
Run Code Online (Sandbox Code Playgroud)
(同样,不要立即将整个文件加载到内存中。)
我不熟悉 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);
Run Code Online (Sandbox Code Playgroud)
请注意,row这是一个承诺,但足够接近。
将其粘贴到babel中。
| 归档时间: |
|
| 查看次数: |
2402 次 |
| 最近记录: |