Как читать из stdin по строкам в узле

Я ищу для обработки текстового файла с узлом, используя вызов командной строки, например:

node app.js < input.txt

Каждая строка файла должна обрабатываться индивидуально, но после обработки строка ввода может быть забыта.

Используя прослушиватель on-data для stdin, я получаю входной пар, помещенный размером байта, поэтому я установил его.

 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); }); 

Но это кажется таким неряшливым. Необходимо массировать первый и последний элементы массива линий. Нет ли более элегантного способа сделать это?

Вы можете использовать модуль readline для чтения по строке stdin:

 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 специально разработан для работы с терминалом (то есть proccess.stdin.isTTY === true ). Существует множество модhive, которые обеспечивают разделяемую функциональность для генерических streamов, например 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); 

В моем случае программа (elinks) вернула строки, которые выглядели пустыми, но на самом деле были специальные символы терминала, коды управления цветом и backspace, поэтому опции grep , представленные в других ответах, не работали для меня. Поэтому я написал этот небольшой скрипт в Node.js. Я назвал файл tight , но это просто случайное имя.

 #!/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) }) 

для других:

read stream line by line, должен быть хорош для больших файлов, передаваемых в 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{ if(buffer.length) var str=buffer.join(''); buffer.length=0; on_line(str,()=>{ ////after end console.error('done') ////end after end }); }); readStream.resume(); - 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{ if(buffer.length) var str=buffer.join(''); buffer.length=0; on_line(str,()=>{ ////after end console.error('done') ////end after end }); }); readStream.resume(); - 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{ if(buffer.length) var str=buffer.join(''); buffer.length=0; on_line(str,()=>{ ////after end console.error('done') ////end after end }); }); readStream.resume(); 
  • Как читать из файла или stdin в Bash?
  • Как заставить ssh получить пароль от stdin
  • Как читать строку с консоли в C?
  • Почему мы не можем читать один символ за раз из System.in?
  • Использование fseek с указателем файла, указывающим на stdin
  • Можно ли установить тайм-аут для std :: cin?
  • Как читать из stdin с помощью fgets ()?
  • nodejs, как читать нажатия клавиш от stdin
  • запустить exe / process с stdin stdout и stderr?
  • Обманите приложение, думая, что его выступление - это терминал, а не труба
  • Предоставить пароль SU в сценарии bash, в скрипте?
  • Interesting Posts

    Как вы конкретно заказываете ось ggplot2 x вместо алфавитного порядка?

    Как получить значение параметра из строки запроса

    Предотrotation изменения часового пояса при десериализации значения DateTime

    Выдача системных команд в Linux с C, C ++

    Распространять список процессов на многие машины Windows

    Использование «super» в C ++

    Имея стороннюю банку, включенную в затененную банку Maven, не добавляя ее в локальный repository

    Измените текущий каталог из сценария Bash

    Связать несколько фильтров () в Django, это ошибка?

    Как вернуть значение dataSnapshot в результате метода?

    Как использовать различные сетевые интерфейсы для разных процессов?

    Где останавливать / уничтожать streamи в classе Android Service?

    Как использовать (->) экземпляры Monad и путаницу о (->)

    Плохая производительность и странное поведение с момента обновления Windows 10 Creators

    Есть ли способ получить исходный код из файла APK?

    Давайте будем гением компьютера.