Chcę przetworzyć plik tekstowy z węzłem za pomocą wywołania wiersza poleceń, takiego jak:
node app.js < input.txt
Każda linia pliku musi być przetwarzana indywidualnie, ale po przetworzeniu linii wejściowej można zapomnieć.
Korzystając z nasłuchiwania danych standardowego wejścia, otrzymuję porcję pary wejściowej o rozmiar bajtu, więc ustawiłem to.
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);
});
Ale to wydaje się takie niechlujne. Konieczność masowania wokół pierwszego i ostatniego elementu linii. Czy nie ma na to bardziej eleganckiego sposobu?
process.stdout
na inny strumień do zapisu - może to być tak proste, jakoutput: new require('stream').Writable()
node app.js < input.txt > output.txt
.terminal: false
do createInterface rozwiązuje ten problem.źródło
Error: EISDIR: illegal operation on a directory, fstat at
tryStatSync (fs.js: 534: 13) `fs.readFileSync(0).toString()
readline
jest specjalnie zaprojektowany do współpracy z terminalem (to znaczyprocess.stdin.isTTY === true
). Istnieje wiele modułów, które zapewniają funkcję podziału dla strumieni ogólnych, takich jak split . To sprawia, że wszystko jest bardzo łatwe:źródło
.on('end', doMoreStuff)
po pierwszym.on()
. Pamiętaj, że jeśli po prostu napiszesz kod normalnie po instrukcji z.on()
, ten kod zostanie uruchomiony przed odczytaniem jakichkolwiek danych wejściowych, ponieważ JavaScript nie jest synchroniczny.źródło
udostępnianie innym:
czytaj strumień wiersz po wierszu, powinno być dobre dla dużych plików przesyłanych potokiem do stdin, moja wersja:
źródło
W moim przypadku program (elinks) zwrócił wiersze, które wyglądały na puste, ale w rzeczywistości miały specjalne znaki terminala, kody kontrolne koloru i cofnięcie, więc
grep
opcje przedstawione w innych odpowiedziach nie działały dla mnie. Więc napisałem ten mały skrypt w Node.js. Zadzwoniłem do plikutight
, ale to tylko przypadkowa nazwa.źródło