使用readline node.js

时间:2017-02-14 17:04:01

标签: javascript node.js readline

请考虑以下代码。我想要做的是逐个从names.txt函数中的createStream中选择名称,并从FileSearch函数调用nameToSearch作为参数并搜索list.txt逐行。所以一个名称和逐行搜索list.txt,另一个名称和逐行搜索list.txt等等......

list.txt,是一个大文件。如果找到匹配项,则输出搜索字符串和行号。我以为它会输出一个名字和行号,然后转到第二个名字,依此类推,但它是

  1. 跳过行。我手动搜索了一些名字,输出中没有相应的行号。

  2. 混合名称。我可以在输出的初始部分看到名称,然后在输出中的其他位置看到。

  3. 代码:

    var fs = require('fs')
    var readline = require('readline');
    
    var nameToSearch
    
    var createStream = function (){
    var lineNumber=0;
    var ended = false;
    var rlName = readline.createInterface({
          input : fs.createReadStream('./names.txt'),
          output: process.stdout,
          terminal: false
          })
    rlName.on('line',function(lineInNameFile){
         ++lineNumber;
          nameToSearch=lowercase(lineInNameFile);
         FileSearch(nameToSearch);
         })
    }
    
    
    var lowercase=function(str){
         return String(str).toLowerCase();
    }
    
    var  FileSearch = function (searchString){
    var listlineNumber=0;
    var rlList = readline.createInterface({   
          input : fs.createReadStream('./list-2.txt'),
          output: process.stdout,
          terminal: false
    })
    rlList.on('line',function(lineInListFile){
         ++listlineNumber;
         if (lineInListFile===searchString){
             console.log( searchString+ ":" + listlineNumber);
         } 
    
    })
    
    } 
    
    var runSearch = createStream();
    exports.createStream = createStream; 
    

    names.txt看起来像这样

    OLIVER
    CHARLOTTE
    LIAM
    AMELIA
    .
    .
    

    list.txt看起来像这样,两个文件中每行基本上只有一个单词

    a
    aah
    aahed
    aahing
    aback
    abacus
    abacuses
    abaft
    abalone
    abalones
    .
    .
    

    我在控制台上的输出是这样的

    grayson:2322
    emmett:3756
    emmett:6399
    lily:3739
    lily:6340
    .
    .
    

    我没有正确使用readline模块吗?

    编辑:在查看更多内容并进行搜索时发现它可能需要在阅读最后一行时执行某些操作。它没有阅读list.txt的最后一行。我不知道为什么

1 个答案:

答案 0 :(得分:0)

我设法通过使用逐行模块解决问题,现在输出与预期完全一致。继承人的代码

var nameToSearch

//Function to retrieve names

var createStream = function (){

var lineNumber=0;
var nameLine = require('line-by-line')
lrName = new nameLine('./names.txt');
//lrName = new nameLine('./names-testFile.txt');

var ended = false;

 lrName.on('line', function (lineInNameFile) {
    ++lineNumber;
    nameToSearch=lowercase(lineInNameFile);
    FileSearch(nameToSearch);
 });     


}


var lowercase=function(str){
     return String(str).toLowerCase();
}

 //Function to search in list file

var  FileSearch = function (searchString){

    var LineByLineReader = require('line-by-line'),
    lr = new LineByLineReader('./list.txt');
    //lr = new LineByLineReader('./list-testFile.txt');
    var listlineNumber=0
    var arr = []

    lr.on('line', function (lineInListFile) {
        ++listlineNumber;
        if (lineInListFile===searchString){
            arr.push(listlineNumber);

        } 
     });

     lr.on('end', function () {
            console.log( searchString+ ":" + arr);
     });

} 

var runSearch = createStream();

exports.createStream = createStream;