Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将包含有序数据的两个流合并到node.js中的一个流中_Javascript_Node.js_Stream - Fatal编程技术网

Javascript 将包含有序数据的两个流合并到node.js中的一个流中

Javascript 将包含有序数据的两个流合并到node.js中的一个流中,javascript,node.js,stream,Javascript,Node.js,Stream,我是node.js的新手。问题是读取2个(或更多)具有排序数据的流,并生成它们的“排序合并”。 例如: Stream A: 1 5 6 8 Stream B: 2 3 4 7 ======================== Result: 1 2 3 4 5 6 7 8 在C++/Java/C中,这有一个非常明显的解决方案,类似于: BufferedReader[] readers = new BufferedReader[2]; String[] lines = new String[2]

我是node.js的新手。问题是读取2个(或更多)具有排序数据的流,并生成它们的“排序合并”。 例如:

Stream A: 1 5 6 8
Stream B: 2 3 4 7
========================
Result: 1 2 3 4 5 6 7 8
在C++/Java/C中,这有一个非常明显的解决方案,类似于:

BufferedReader[] readers = new BufferedReader[2];
String[] lines = new String[2];
// fill lines with initial values from both readers
// ...
while (true) {
    int earliestIndex = -1;
    // ....
    // determine earliestIndex by looping over lines and comparing them
    if (earliestIndex < 0) break;
    String line = lines[earliestIndex];
    // do something with line
    System.out.println(line);
    // advance reader
    lines[earliestIndex] = readers[earliestIndex].readLine();
}
BufferedReader[]readers=新的BufferedReader[2];
字符串[]行=新字符串[2];
//用两个读卡器的初始值填充行
// ...
while(true){
int-earliestIndex=-1;
// ....
//通过在行上循环并比较它们来确定最早的索引
如果(早期指数<0)中断;
字符串行=行[早期索引];
//用绳子做点什么
系统输出打印项次(行);
//高级读取器
行[earliestIndex]=读卡器[earliestIndex].readLine();
}

但在node中,这似乎相当困难。有什么想法吗

我终于想出了一个解决办法。我使用的是逐行读取流(文件流,但这很容易更改):

var LineReader=require('node-line-reader')。LineReader;
var files=['c:\\temp\\1.txt','c:\\temp\\2.txt'];
var读取器=[];
var行=[];
var readWhile=函数(完成){
var earliestIndex=-1;
var=最大值;
对于(i=0;i
var LineReader = require('node-line-reader').LineReader;

var files = ['c:\\temp\\1.txt', 'c:\\temp\\2.txt'];
var readers = [];
var lines = [];

var readWhile = function (done) {
    var earliestIndex = -1;
    var earliest = MAX_VALUE;
    for (i = 0; i < lines.length; i++) {
        var l = lines[i];
        var value = parseInt(l);
        if (value < earliest) {
            earliest = value;
            earliestIndex = i;
        }
    }
    if (earliestIndex < 0) {
        done();
        return;
    }
    var line = lines[earliestIndex];
    console.log('Read from ' + files[earliestIndex] + ': ' + line);
    readers[earliestIndex].nextLine(function (err, line) {
        if (err) throw err;
        lines[earliestIndex] = line;
        process.nextTick(function () {
            readWhile(done);
        });
    });
}

new Promise(function (success, error) {
   for (i = 0; i < files.length; i++) {
      var reader = new LineReader(files[i]);
      readers.push(reader);
      new Promise(function (success, failure) {
         reader.nextLine(function (err, line) {
            if (err) failure(err);
            lines.push(line);
            success();
         });
      }).then(function (data) {
         if (lines.length == files.length) success();
      });
   }
}).then(function (data) {
    return new Promise(function (success, failure) {
        readWhile(success);
    });
}).then(function() {
   console.log('All done');
}, function (err) {
   console.log('Error: ' + err);
});