gpt4 book ai didi

node.js - 使用 Bluebird 将所有 csv 文件读入 Node js 中的 1 个 JSON 对象数组

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:30 25 4
gpt4 key购买 nike

我是在 NodeJS 中使用 Promise Bluebird 的新手。

我想将特定目录中的所有 CSV 文件读入 1 个 JSON 对象数组并显示结果。

步骤是:

  1. 读取目录以获取文件名(调用函数 readDir)
  2. 使用循环读取每个 CSV 文件(lodash forOwn 循环)并将内容存储在 JSON 对象数组中(调用 ReadFile 函数)
  3. 将 JSON 对象数组(使用 Lodash 分配函数)与主 JSON 对象数组(名为 data_Warehouse)合并,以便所有数据都存储到 1 个 JSON 对象数组中。
  4. 将所有 CSV 文件数据保存到 JSON 对象数组 data_Warehouse 后,在 console.log(.then 部分)中显示 data_Warehouse。

检查是否一切都按照计划进行,我将其放入代码之间的 console.log 中。问题在于这些过程没有按正确的顺序完成。我尝试使用 Bluebird,但它仍然没有按计划进行。

您能帮我解决这个问题吗?

这是我的输出:

<小时/>

输出:加载\Book1.csv

输出:加载\Book2.csv

输出:加载\Book3.csv

结果:{}

加载\Book1.csv 101

加载\Book2.csv 102

加载\Books.csv 103

<小时/>

如您所见,行输出“结果”应该是最后一个,但它位于 JSON 对象数组 data_Warehouse 为空的过程中的较早位置。

var Converter = require("csvtojson").Converter;
var converter = new Converter({});
var _ = require('lodash');
var r = require('rethinkdbdash')(config.rethinkdb);
var fs = Promise.promisifyAll(require('fs'));

readDir()
.then(function(v){

var data_Warehouse={};
_.forOwn(v, function(index){
console.log('output:' + index);
_.assign(data_Warehouse, readFile(index));
});
return mine;

}).then(function(w){
console.log('Results:' + w.length);
})

function readDir() {
return fs.readdirAsync(dir).map(function (fileName) {
var path = Path.join(dir, fileName);
return fs.statAsync(path).then(function(stat) {
return stat.isDirectory() ? readDir(path) : path;
});
}).reduce(function (a, b) {

return a.concat(b);
}, []);
}


function readFile(fileName){
var converter = new Converter({});
fs.createReadStream(fileName).pipe(converter);
converter.on("end_parsed", function (jsonArray) {
console.log(fileName + ' ' + jsonArray[0].Order_ID);
return jsonArray;
})
}
<小时/>

我更改了代码(使用了promisifyAll),现在可以读取指定目录中的所有文件并以正确的顺序显示结果,但是使用csvtojson将每个文件上读取的数据转换为json现在是问题。它将在 console.log('results: ' + result[Ticker].Order_ID); 之前显示 'done....' (见下面的输出)。

var join = Promise.join;
var fs = Promise.promisifyAll(require("fs"));
var Converter = require("csvtojson").Converter;
var Promise = require('bluebird');
var dir='./load/';

fs.readdirAsync(dir).map(function(fileName) {
var contents = fs.readFileAsync(fileName).catch(function ignore() {});
return join(fileName, contents, function(fileName, contents) {
return {
fileName: fileName,
contents: contents
}
});

}).each(function(file) {
console.log('File Name: ' + file.fileName + '\n');
console.log('output: ' + file.contents + '\n');

var converter = new Converter({});
var temp = file.contents.toString();
var tmp;
converter.on("end_parsed", function() {});
converter.fromString(temp, function(err, result){
tmp = result;
for(var Ticker in result){
console.log('results: ' + result[Ticker].Order_ID);
}
});

console.log('___________________');
return tmp;
}).then(function(contents) {
console.log('Done.............');
})

我的输出现在是:

文件名:Book1.csv

输出:订单ID、数量、价格、日期、备注

123, 1000, 12.95,10/8/2015, 测试786, 100, 7.95,11/6/2015, 测试2

<小时/>

文件名:Book2.csv

输出:订单ID、数量、价格、日期、备注

4526、800、2.95、2015 年 4 月 1 日、测试 3129, 10, 3.66,1/23/2014, 测试4

<小时/>

完成............

结果:1​​23

结果:786

结果:4526

结果:1​​29

如何将 csvtojson 转换器恢复到正确的顺序,以便“完成...”出现在流程结束时?

已编辑:

现在我已经 promise 了 csvtojson,但由于某种原因它不起作用。

var join = Promise.join;
var fs = Promise.promisifyAll(require("fs"));
var Converter = require("csvtojson").Converter;
var Promise = require('bluebird');
var dir='./load/';

jsons= function(data){
var converter = new Converter({});
var output;
converter.on("end_parsed", function() {});
converter.fromString(data, function(err, result){
for(var Ticker in result){
console.log('results: ' + result[Ticker].Ticker);
}
output = result;
});
return output;
};

var conversionJsons = Promise.promisifyAll(jsons);

fs.readdirAsync(dir).map(function(fileName) {
var contents = fs.readFileAsync(fileName).catch(function ignore() {});
return join(fileName, contents, function(fileName, contents) {
return {
fileName: fileName,
contents: contents
}
});


}).each(function(file) {
console.log('File Name: ' + file.fileName + '\n');
console.log('output: ' + file.contents + '\n');

console.log('___________________');
var temp = file.contents.toString();
conversionJsons(temp).then(function(result){ // <----Error here for then
console.log("results are: "+ result);
return result;

});
}).then(function(contents) {
console.log('Done.............');

})

我收到以下错误:

“无法读取未定义的属性‘then’”

你能帮我解决这个问题吗?

最佳答案

好吧,你正在遭受 race condition 的困扰在那里,因为您的操作是异步运行的。

我的建议是使用一系列的 promise 和 chain them按照您想要的顺序,然后等到所有内容都满足后发送您想要的结果,您应该使用 promise.all

关于node.js - 使用 Bluebird 将所有 csv 文件读入 Node js 中的 1 个 JSON 对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37870414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com