web-dev-qa-db-ja.com

stdinから文字列まですべてのテキストを読み取ります

私はNode.jsでプログラムを作成しています(これは、状況によっては)単純なフィルターとして機能する必要があります。標準入力(ファイルの終わりまで)からすべてを読み取り、処理を行い、結果を標準出力に書き込みます。

「標準入力からすべてを読み取る」部分はどのように行うのですか?私がこれまでに見つけた最も近い解決策は、コンソールから一度に1行ずつ機能するか、stdinがパイプではなくファイルである場合にのみ機能するようです。

30
rwallace

これのボイラープレートは、上記のコメントで説明されている解決策とよく似ています。これは、これを行う最も簡単な方法であり、コメントだけでなく、トップレベルで提供するためです。

var fs = require('fs');
var data = fs.readFileSync(0, 'utf-8');
// Data now points to a buffer containing the file's contents
13

Linuxを使用している場合は、このためのサードパーティパッケージは必要ありません。もちろん、パフォーマンスのニーズを考慮してください。ただし、次の2行で十分です。

const fs = require("fs");
const data = fs.readFileSync("/dev/stdin", "utf-8");

Janは以下のコメントで、より移植性の高いソリューションは0、これはPOSIX標準であるため。したがって、簡単に使用できます。

const fs = require("fs");
const data = fs.readFileSync(0, "utf-8");

dataは、utf 8として解釈されるstdinからのデータを含む文字列になりました

21

get-stdin はトリックを実行します。


質問の行の間を読んでいるいくつかのメモ。

「synchronous」という質問にタグを付けたので、stdinはnode.jsで非同期のみであることに注意してください。上記のライブラリは、最もシンプルです。入力全体を文字列またはバッファとして扱います。

可能な場合は、ストリーミングスタイルでプログラムを作成するのが最適ですが、一部のユースケースはストリーミングに適しています(つまり、ワード数)。

また、「コンソールから一度に1行」は、キーストロークをバッファリングする端末のアーティファクトです。 「ごめんなさい」というレベルの詳細が必要な場合は、すばらしい TTY Demystified を確認してください。

10
Peter Lyons

Node 11+

async function read(stream) {
    let buffer = Buffer.alloc(0);
    for await (const chunk of stream) {
        buffer = Buffer.concat([buffer, chunk]);
    }
    return buffer.toString('utf8');
}

使用法:

const input = await read(process.stdin);
8
qwtel