Saya mencari untuk memproses file teks dengan simpul menggunakan panggilan baris perintah seperti:
node app.js < input.txt
Setiap baris file perlu diproses secara individual, tetapi begitu diproses, baris input dapat dilupakan.
Menggunakan pendengar on-data dari stdin, saya mendapatkan input steam yang dipotong oleh ukuran byte jadi saya mengaturnya.
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);
});
Tapi ini sepertinya sangat ceroboh. Harus memijat sekitar item pertama dan terakhir dari array garis. Apakah tidak ada cara yang lebih elegan untuk melakukan ini?
process.stdout
ke aliran tulisan yang berbeda - bisa sesederhanaoutput: new require('stream').Writable()
node app.js < input.txt > output.txt
.terminal: false
untuk membuat Antarmuka, itu memperbaiki masalah ini.sumber
Error: EISDIR: illegal operation on a directory, fstat at
tryStatSync (fs.js: 534: 13) `fs.readFileSync(0).toString()
readline
dirancang khusus untuk bekerja dengan terminal (yaituprocess.stdin.isTTY === true
). Ada banyak modul yang menyediakan fungsionalitas split untuk stream umum, seperti split . Itu membuat segalanya sangat mudah:sumber
.on('end', doMoreStuff)
setelah yang pertama.on()
. Ingat bahwa jika Anda hanya menulis kode secara normal setelah pernyataan dengan.on()
, kode itu akan berjalan sebelum input apa pun dibaca, karena JavaScript tidak sinkron.sumber
berbagi untuk orang lain:
baca stream baris demi baris, harus bagus untuk file besar yang disalurkan ke stdin, versi saya:
sumber
Dalam kasus saya program (elinks) mengembalikan baris yang tampak kosong, tetapi sebenarnya memiliki karakter terminal khusus, kode kontrol warna dan backspace, sehingga
grep
opsi yang disajikan dalam jawaban lain tidak bekerja untuk saya. Jadi saya menulis skrip kecil ini di Node.js. Saya menelepon file itutight
, tapi itu hanya nama acak.sumber