【问题标题】:Synchronisation of createReadStreamcreateReadStream 的同步
【发布时间】:2022-01-13 00:41:42
【问题描述】:

我对 Javascript 非常陌生。我要做的就是从本地读取一个 CSV 文件并使用数据进行处理,例如将行转换为数组的数组。我遇到了fs.createReadStream,它有助于读取 csv 数据,但我以后无法使用处理过的 csv 数据。我读了一些帖子,我猜是同步的问题。 我的代码看起来像这样-

ar abc = [] 
const csv = require('csv-parser');
const fs = require('fs');

fs.createReadStream('data.csv')
  .pipe(csv())
  .on('data', (row) => {
    var nums =[];

   // console.log(row);
    nums.push(row['time'])
    nums.push(row['return'])
    
    abc.push(nums)
    
  })
  .on('end', function () {
    console.log(abc)
      })
  

  var final_sort= []
  console.log()
  for (let i = 0; i < abc.length; i=i+5){

    final_sort.push(abc[i])


  } 
  console.log(final_sort)

这首先在 fs 之外输出日志,然后输出 fs.createReadStream。我想要fs。先处理 createReadStream ,然后我可以进一步利用数据。

【问题讨论】:

  • 只需将所有使用abc 的代码移动到on('end', …) 回调中。
  • 还要检查 react-csv 模块。你可以从中启发一些逻辑
  • @AbdennourTOUMI OP 正在使用 nodejs,这与 react 模块有什么关系?
  • 我是说激发逻辑,而不是像原来那样重复使用它

标签: javascript node.js fs


【解决方案1】:

如果你想处理你的序列,那么你必须尝试承诺

如果您的任务是读取所有数据然后排序,那么您的代码将是这样的

var abc = []
const csv = require('csv-parser');
const fs = require('fs');
// -----------1 process start
await new Promise((resolve, reject) => {
  fs.createReadStream('data.csv')
    .pipe(csv())
    .on('data', (row) => {
      var nums = [];

      // console.log(row);
      nums.push(row['time'])
      nums.push(row['return'])

      abc.push(nums)

    })
    .on('end', function () {
      console.log(abc)
      //---------- 2 return after all data read
      resolve()
    })
});
//---------- 3 here you get all data
var final_sort = []
console.log()
for (let i = 0; i < abc.length; i = i + 5) {

  final_sort.push(abc[i])


}
console.log(final_sort)

供参考 understanding-javascript-promises

【讨论】:

  • 你会想要使用require('stream/promises').pipelinerequire('events').once,而不是new Promise
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 2021-09-14
相关资源
最近更新 更多