使用 readline node.js 搜索文本文件
Searching text file with readline node.js
请考虑以下代码。我想要做的是从 createStream
函数中的 names.txt
中一个接一个地选择名称,然后从那里调用 FileSearch
函数并将 nameToSearch
作为参数并搜索 list.txt
逐行。所以一个名字并逐行搜索 list.txt
,另一个名字并逐行搜索 list.txt
等等...
list.txt
,是一个大文件。如果找到匹配项,则输出搜索字符串和行号。我以为它会放一个名字和行号,然后移到第二个名字等等,但它是
跳过行。我手动搜索了一些名称,输出中没有相应的行号)
混合名称。我可以在输出的初始部分看到名字,然后在输出的其他地方看到名字。
代码:
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
的最后一行。我不确定为什么
我设法使用 line-by-line 模块解决了这个问题,现在输出与预期完全一致。这是代码
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;
请考虑以下代码。我想要做的是从 createStream
函数中的 names.txt
中一个接一个地选择名称,然后从那里调用 FileSearch
函数并将 nameToSearch
作为参数并搜索 list.txt
逐行。所以一个名字并逐行搜索 list.txt
,另一个名字并逐行搜索 list.txt
等等...
list.txt
,是一个大文件。如果找到匹配项,则输出搜索字符串和行号。我以为它会放一个名字和行号,然后移到第二个名字等等,但它是
跳过行。我手动搜索了一些名称,输出中没有相应的行号)
混合名称。我可以在输出的初始部分看到名字,然后在输出的其他地方看到名字。
代码:
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
的最后一行。我不确定为什么
我设法使用 line-by-line 模块解决了这个问题,现在输出与预期完全一致。这是代码
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;