首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Bluebird将所有csv文件读入节点js中的1个JSON对象数组中

用Bluebird将所有csv文件读入节点js中的1个JSON对象数组中
EN

Stack Overflow用户
提问于 2016-06-16 22:30:10
回答 1查看 1.3K关注 0票数 1

我是新使用承诺蓝鸟在nodeJS。

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

这些步骤是:

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

如果所有的检查都按计划进行,我把console.log放在代码之间。问题是流程没有按照正确的顺序完成。我试着使用蓝知更鸟,但它仍然没有按照计划进行。

请你帮我处理这件事好吗?

这就是我的输出:

输出:load\Book1.csv

输出:load\Book2.csv

输出:load\Book3.csv

结果:{}

load\Book1.csv 101

负载\Book2.csv 102

load\Books.csv 103

正如您所看到的,行输出“结果”应该是最后一个,但是在data_Warehouse对象数组为空的过程中,这是在前面。

代码语言:javascript
复制
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之前(“结果:”+ resultTicker.Order_ID);(见下面的输出)。

代码语言:javascript
复制
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

输出: Order_ID,数量,价格,日期,备注

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

文件名: Book2.csv

输出: Order_ID,数量,价格,日期,备注

4526,800,2.95,4/1/2015,test3 129,10,3.66,1/23/2014,test4

已订立.

结果: 123

结果: 786

结果: 4526

结果: 129

我如何使转换器csvtojson回到正确的顺序,这样做.是在过程的尽头吗?

编辑:

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

代码语言:javascript
复制
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.............');

})

我得到以下错误:

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-06-16 23:03:24

因为您的操作是异步运行的,所以您在那里受到了种族条件的困扰。

我的建议是按照您想要的顺序使用一系列的承诺和把它们拴起来,然后等到所有的承诺都满足后,按照您的意愿发送结果,您应该使用promise.all

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37870414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档