Node.jsプログラミング:stdin操作をマスターして自由自在なデータ処理を実現
Node.js で stdin を行ごとに読み込む方法
以下では、Node.js で stdin を行ごとに読み込む 2 つの一般的な方法について説明します。
readline モジュールを使用する
readline
モジュールをインポートします。
const readline = require('readline');
readline.createInterface()
関数を使用して、readline
インターフェースを作成します。
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (line) => {})
イベントリスナーを使用して、各行の読み取り時に実行されるコールバック関数を定義します。
rl.on('line', (line) => {
console.log(line);
});
rl.prompt()
メソッドを使用して、ユーザーに入力プロンプトを表示します。
rl.prompt();
rl.close()
メソッドを使用して、readline
インターフェースを閉じます。
rl.close();
上記の例では、各行の読み取り時にコンソールに出力されます。必要に応じて、このコールバック関数内でデータを処理したり、ファイルに保存したりすることができます。
it ストリームを使用する
it
ストリームは、Node.js のコアモジュールである stream
モジュールで提供される一種の読み取り専用ストリームです。stdin を行ごとに読み込むために使用できます。この方法を使用するには、以下の手順に従います。
const stream = require('stream');
const it = stream.PassThrough();
process.stdin.pipe(it);
it.on('data', (chunk) => {
const line = chunk.toString();
console.log(line);
});
Node.js で stdin を行ごとに読み込むには、readline
モジュールまたは it
ストリームを使用することができます。どちらの方法もそれぞれ長所と短所があり、ニーズに応じて適切な方法を選択することができます。
readline
モジュール:- 長所: 使いやすく、イベントベースの API を提供しているため、複雑な処理に適している。
- 短所:
it
ストリームよりも若干オーバーヘッドが大きい。
it
ストリーム:- 長所:
readline
モジュールよりも軽量で効率的。 - 短所: イベントベースの API ではないため、複雑な処理には
readline
モジュールほど適していない。
- 長所:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (line) => {
console.log(line);
});
rl.prompt();
rl.close();
このコードを実行すると、以下のようになります。
$ node example.js
一行目を入力してください:
一行目が入力されました
二行目を入力してください:
二行目が入力されました
...
const stream = require('stream');
const it = stream.PassThrough();
process.stdin.pipe(it);
it.on('data', (chunk) => {
const line = chunk.toString();
console.log(line);
});
このコードを実行すると、readline
モジュールを使用した例と同様の結果になります。
説明
これらの例では、stdin から入力された各行をコンソールに出力するシンプルなコールバック関数を使用しています。必要に応じて、このコールバック関数内でデータを処理したり、ファイルに保存したりすることができます。
readline
モジュールを使用する例では、rl.prompt()
メソッドを使用して、ユーザーに入力プロンプトを表示しています。これは、ユーザーが入力するたびに新しい行を要求する場合に役立ちます。it
ストリームを使用する例では、process.stdin.pipe(it)
メソッドを使用して、stdin をit
ストリームにパイプしています。これにより、stdin からのデータがit
ストリームのdata
イベントに送信されます。
fs.readFileSync() 関数を使用する
fs
モジュールの readFileSync()
関数を使用して、stdin をファイルとして読み込むことができます。その後、split()
メソッドを使用して、ファイルを配列の行に変換することができます。この方法は、stdin からのすべての入力を一度に読み込む必要がある場合に役立ちます。
const fs = require('fs');
const input = fs.readFileSync('/dev/stdin', 'utf8');
const lines = input.split('\n');
for (const line of lines) {
console.log(line);
}
forEach() メソッドを使用する
forEach()
メソッドを使用して、stdin からの各行をイテレートすることができます。この方法は、stdin からの入力を処理する必要がある場合に役立ちます。
process.stdin.on('data', (chunk) => {
const lines = chunk.toString().split('\n');
lines.forEach((line) => {
console.log(line);
});
});
ジェネレータを使用する
function readLines() {
const lines = [];
process.stdin.on('data', (chunk) => {
lines.push(chunk.toString());
});
process.stdin.on('end', () => {
const text = lines.join('');
const lines = text.split('\n');
for (const line of lines) {
yield line;
}
});
}
(async () => {
for await (const line of readLines()) {
console.log(line);
}
})();
Node.js で stdin を行ごとに読み込むには、さまざまな方法があります。ニーズに応じて適切な方法を選択することが重要です。
- 少量の入力を処理する必要がある場合は、
readline
モジュールを使用するのが最良の方法です。 - 大量の入力を処理する必要がある場合は、
it
ストリームまたはfs.readFileSync()
関数を使用するのが最良の方法です。 - 非同期に処理する必要がある場合は、ジェネレータを使用するのが最良の方法です。
node.js stdin