225

入力としてファイルまたはストリームのいずれかを期待するライブラリya-csvを使用していますが、文字列があります。

その文字列をノードのストリームに変換するにはどうすればよいですか?

4

12 に答える 12

145

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」イベントは発行されないことに注意してください (ストリーム インターフェイスでは必要ありません)。

于 2014-09-03T17:17:36.220 に答える
32

モジュールの新しいインスタンスを作成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');
于 2012-10-10T18:27:40.420 に答える
12

編集: ガースの答えはおそらくより良いです。

私の古い回答テキストは以下に保存されています。


文字列をストリームに変換するには、一時停止たストリームを使用できます。

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()
于 2013-05-09T05:56:53.097 に答える
11

そのためのモジュールがあります: https://www.npmjs.com/package/string-to-stream

var str = require('string-to-stream')
str('hi there').pipe(process.stdout) // => 'hi there' 
于 2015-08-30T23:44:48.007 に答える
6

コーヒースクリプトで:

class StringStream extends Readable
  constructor: (@str) ->
    super()

  _read: (size) ->
    @push @str
    @push null

これを使って:

new StringStream('text here').pipe(stream1).pipe(stream2)
于 2014-05-23T08:11:16.190 に答える
5

これを 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;

strstring呼び出し時にコンストラクターに渡す必要があり、ストリームによってデータとして出力されます。documentationoptionsに従って、ストリームに渡される可能性のある典型的なオプションです。

Travis CI によると、ほとんどのバージョンのノードと互換性があるはずです。

于 2016-08-16T01:07:37.777 に答える
4

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...')
于 2019-07-14T06:18:29.153 に答える
0

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()
于 2012-10-06T02:04:57.467 に答える
0

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();
于 2021-05-04T05:58:35.640 に答える