私は次のようなコマンドライン呼び出しを使用してノードを持つテキストファイルを処理しようとしています:
node app.js < input.txt
ファイルの各行は個別に処理される必要がありますが、一度処理されると入力行は忘れられます。
標準入力のデータ上のリスナーを使用して、入力Steamをバイトサイズでチャンクして取得するので、これを設定します。
process.stdin.resume();
process.stdin.setEncoding('utf8');
var lingeringLine = "";
process.stdin.on('data', function(chunk) {
lines = chunk.split("\n");
lines[0] = lingeringLine + lines[0];
lingeringLine = lines.pop();
lines.forEach(processLine);
});
process.stdin.on('end', function() {
processLine(lingeringLine);
});
しかし、これはとてもずさんなようです。 lines配列の最初と最後の項目を囲むようにマッサージする必要があります。これを行うためのよりエレガントな方法はありませんか?
行ごとに標準入力から読み込むには、 readline モジュールを使用します。
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
terminal: false
});
rl.on('line', function(line){
console.log(line);
})
readline
は特にterminalで動作するように設計されています(つまりprocess.stdin.isTTY === true
)。 split のように、ジェネリックストリームに分割機能を提供するモジュールはたくさんあります。それは物事を非常に簡単にします。
process.stdin.pipe(require('split')()).on('data', processLine)
function processLine (line) {
console.log(line + '!')
}
// Work on POSIX and Windows
var stdinBuffer = fs.readFileSync(0); // STDIN_FILENO = 0
console.log(stdinBuffer.toString());
#!/usr/bin/env node
const EventEmitter = require('events');
function stdinLineByLine() {
const stdin = new EventEmitter();
let buff = "";
process.stdin
.on('data', data => {
buff += data;
lines = buff.split(/[\r\n|\n]/);
buff = lines.pop();
lines.forEach(line => stdin.emit('line', line));
})
.on('end', () => {
if (buff.length > 0) stdin.emit('line', buff);
});
return stdin;
}
const stdin = stdinLineByLine();
stdin.on('line', console.log);
他の人と共有する:
ストリームを1行ずつ読み込む、私のバージョンであるstdinにパイプされた大きなファイルには良いはずです
var n=0;
function on_line(line,cb)
{
////one each line
console.log(n++,"line ",line);
return cb();
////end of one each line
}
var fs = require('fs');
var readStream = fs.createReadStream('all_titles.txt');
//var readStream = process.stdin;
readStream.pause();
readStream.setEncoding('utf8');
var buffer=[];
readStream.on('data', (chunk) => {
const newlines=/[\r\n]+/;
var lines=chunk.split(newlines)
if(lines.length==1)
{
buffer.Push(lines[0]);
return;
}
buffer.Push(lines[0]);
var str=buffer.join('');
buffer.length=0;
readStream.pause();
on_line(str,()=>{
var i=1,l=lines.length-1;
i--;
function while_next()
{
i++;
if(i<l)
{
return on_line(lines[i],while_next);
}
else
{
buffer.Push(lines.pop());
lines.length=0;
return readStream.resume();
}
}
while_next();
});
}).on('end', ()=>{
if(buffer.length)
var str=buffer.join('');
buffer.length=0;
on_line(str,()=>{
////after end
console.error('done')
////end after end
});
});
readStream.resume();
私の場合、プログラム(elinks)は空に見える行を返しましたが、実際には特別な終端文字、色制御コード、そしてバックスペースを持っていたので、他の答えで示されたgrep
name__オプションは私のために働きませんでした。だから私はNode.jsでこの小さなスクリプトを書きました。ファイルをtight
name__と呼びましたが、これは単なるランダムな名前です。
#!/usr/bin/env node
function visible(a) {
var R = ''
for (var i = 0; i < a.length; i++) {
if (a[i] == '\b') { R -= 1; continue; }
if (a[i] == '\u001b') {
while (a[i] != 'm' && i < a.length) i++
if (a[i] == undefined) break
}
else R += a[i]
}
return R
}
function empty(a) {
a = visible(a)
for (var i = 0; i < a.length; i++) {
if (a[i] != ' ') return false
}
return true
}
var readline = require('readline')
var rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false })
rl.on('line', function(line) {
if (!empty(line)) console.log(line)
})