入力としてファイルまたはストリームのいずれかを期待するライブラリya-csvを使用していますが、文字列があります。
その文字列をノードのストリームに変換するにはどうすればよいですか?
入力としてファイルまたはストリームのいずれかを期待するライブラリya-csvを使用していますが、文字列があります。
その文字列をノードのストリームに変換するにはどうすればよいですか?
Jo Liss の履歴書の回答は使用しないでください。ほとんどの場合は機能しますが、私の場合は、4 ~ 5 時間かけてバグを見つけるのに時間を費やしました。これを行うためにサードパーティのモジュールは必要ありません。
新しい答え:
var Readable = require('stream').Readable
var s = new Readable()
s.push('beep') // the string you want
s.push(null) // indicates end-of-file basically - the end of the stream
これは、完全に準拠した読み取り可能なストリームである必要があります。ストリームを適切に使用する方法の詳細については、こちらを参照してください。
OLD ANSWER : ネイティブの PassThrough ストリームを使用するだけです:
var stream = require("stream")
var a = new stream.PassThrough()
a.write("your string")
a.end()
a.pipe(process.stdout) // piping will work as normal
/*stream.on('data', function(x) {
// using the 'data' event works too
console.log('data '+x)
})*/
/*setTimeout(function() {
// you can even pipe after the scheduler has had time to do other things
a.pipe(process.stdout)
},100)*/
a.on('end', function() {
console.log('ended') // the end event will be called properly
})
「close」イベントは発行されないことに注意してください (ストリーム インターフェイスでは必要ありません)。
モジュールの新しいインスタンスを作成stream
し、必要に応じてカスタマイズするだけです。
var Stream = require('stream');
var stream = new Stream();
stream.pipe = function(dest) {
dest.write('your string');
return dest;
};
stream.pipe(process.stdout); // in this case the terminal, change to ya-csv
また
var Stream = require('stream');
var stream = new Stream();
stream.on('data', function(data) {
process.stdout.write(data); // change process.stdout to ya-csv
});
stream.emit('data', 'this is my string');
編集: ガースの答えはおそらくより良いです。
私の古い回答テキストは以下に保存されています。
文字列をストリームに変換するには、一時停止したストリームを使用できます。
through().pause().queue('your string').end()
例:
var through = require('through')
// Create a paused stream and buffer some data into it:
var stream = through().pause().queue('your string').end()
// Pass stream around:
callback(null, stream)
// Now that a consumer has attached, remember to resume the stream:
stream.resume()
そのためのモジュールがあります: https://www.npmjs.com/package/string-to-stream
var str = require('string-to-stream')
str('hi there').pipe(process.stdout) // => 'hi there'
コーヒースクリプトで:
class StringStream extends Readable
constructor: (@str) ->
super()
_read: (size) ->
@push @str
@push null
これを使って:
new StringStream('text here').pipe(stream1).pipe(stream2)
これを 6 か月ごとに再学習する必要があることにうんざりしたので、実装の詳細を抽象化するために npm モジュールを公開しました。
https://www.npmjs.com/package/streamify-string
これはモジュールのコアです:
const Readable = require('stream').Readable;
const util = require('util');
function Streamify(str, options) {
if (! (this instanceof Streamify)) {
return new Streamify(str, options);
}
Readable.call(this, options);
this.str = str;
}
util.inherits(Streamify, Readable);
Streamify.prototype._read = function (size) {
var chunk = this.str.slice(0, size);
if (chunk) {
this.str = this.str.slice(size);
this.push(chunk);
}
else {
this.push(null);
}
};
module.exports = Streamify;
str
string
呼び出し時にコンストラクターに渡す必要があり、ストリームによってデータとして出力されます。documentationoptions
に従って、ストリームに渡される可能性のある典型的なオプションです。
Travis CI によると、ほとんどのバージョンのノードと互換性があるはずです。
TypeScript の整然としたソリューションを次に示します。
import { Readable } from 'stream'
class ReadableString extends Readable {
private sent = false
constructor(
private str: string
) {
super();
}
_read() {
if (!this.sent) {
this.push(Buffer.from(this.str));
this.sent = true
}
else {
this.push(null)
}
}
}
const stringStream = new ReadableString('string to be streamed...')
JavaScript はダックタイプなので、読み取り可能なストリームの APIをコピーするだけで問題なく動作します。実際、おそらくこれらのメソッドのほとんどを実装できないか、単にスタブのままにしておくことはできません。実装する必要があるのは、ライブラリが使用するものだけです。Node のビルド済みEventEmitter
クラスを使用してイベントを処理することもできるため、自分で実装する必要はありませんaddListener
。
これを CoffeeScript で実装する方法は次のとおりです。
class StringStream extends require('events').EventEmitter
constructor: (@string) -> super()
readable: true
writable: false
setEncoding: -> throw 'not implemented'
pause: -> # nothing to do
resume: -> # nothing to do
destroy: -> # nothing to do
pipe: -> throw 'not implemented'
send: ->
@emit 'data', @string
@emit 'end'
次に、次のように使用できます。
stream = new StringStream someString
doSomethingWith stream
stream.send()
NodeJS では、いくつかの方法で読み取り可能なストリームを作成できます。
解決策 1
モジュールでできfs
ます。この関数fs.createReadStream()
を使用すると、読み取り可能なストリームを開くことができ、ファイルのパスを渡してストリーミングを開始するだけです。
const fs = require('fs');
const readable_stream = fs.createReadStream('file_path');
解決策 2
ファイルを作成したくない場合は、メモリ内ストリームを作成し、それを使用して何かを行うことができます (たとえば、どこかにアップロードします)。stream
モジュールでこれを行うことができます。Readable
モジュールからインポートstream
でき、読み取り可能なストリームを作成できます。オブジェクトを作成するときread()
に、内部バッファからデータを読み取るために使用されるメソッドを実装することもできます。読み取り可能なデータがない場合は、null
が返されます。オプションのsize
引数は、読み取る特定のバイト数を指定します。引数が指定されていない場合size
、内部バッファーに含まれるすべてのデータが返されます。
const Readable = require('stream').Readable;
const readable_stream = new Readable({
read(size) {
// ...
}
});
解決策 3
ネットワーク経由で何かを取得する場合、ストリームのように取得できます (たとえば、API から PDF ドキュメントを取得する場合など)。
const axios = require('axios');
const readable_stream = await axios({
method: 'get',
url: "pdf_resource_url",
responseType: 'stream'
}).data;
解決策 4
サードパーティのパッケージは、機能としてストリームの作成をサポートできます。これは、aws-sdk
ファイルを にアップロードするために通常使用されるパッケージの方法ですS3
。
const file = await s3.getObject(params).createReadStream();