ฉันใช้ไลบรารีya-csvซึ่งคาดว่าไฟล์หรือสตรีมเป็นอินพุต แต่ฉันมีสตริง
ฉันจะแปลงสตริงนั้นเป็นสตรีมในโหนดได้อย่างไร
ฉันใช้ไลบรารีya-csvซึ่งคาดว่าไฟล์หรือสตรีมเป็นอินพุต แต่ฉันมีสตริง
ฉันจะแปลงสตริงนั้นเป็นสตรีมในโหนดได้อย่างไร
คำตอบ:
จากโหนด 10.17 from
สตรีมอ่านได้มีวิธีสร้างสตรีมจาก iterable ใด ๆ ได้ง่าย (ซึ่งรวมถึงตัวอักษรอาร์เรย์):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
โปรดทราบว่าอย่างน้อยระหว่าง 10.17 ถึง 12.3 สตริงเป็นตัว iterable ดังนั้นReadable.from("input string")
จะใช้งานได้ แต่ปล่อยหนึ่งเหตุการณ์ต่อตัวละคร Readable.from(["input string"])
จะปล่อยหนึ่งเหตุการณ์ต่อรายการในอาร์เรย์ (ในกรณีนี้หนึ่งรายการ)
นอกจากนี้โปรดทราบว่าในโหนดภายหลัง (อาจเป็น 12.3 เนื่องจากเอกสารระบุว่าฟังก์ชั่นเปลี่ยนไปแล้ว) จึงไม่จำเป็นต้องห่อสตริงในอาร์เรย์อีกต่อไป
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
เป็น@substackแก้ไขฉันใน#node , สตรีม APIใหม่ใน Node v10 ทำให้ง่ายขึ้น:
const Readable = require('stream').Readable;
const s = new Readable();
s._read = () => {}; // redundant? see update below
s.push('your text here');
s.push(null);
... หลังจากที่คุณได้อย่างอิสระสามารถท่อหรือมิฉะนั้นจะผ่านมันไปยังผู้บริโภคที่คุณตั้งใจ
มันไม่สะอาดเท่าresumer one-liner แต่จะหลีกเลี่ยงการพึ่งพาพิเศษ
( อัปเดต:ใน v0.10.26 ถึง v9.2.1 จนถึงตอนนี้การเรียกไปยังpush
พรอมต์ REPL โดยตรงจะล้มเหลวโดยมีnot implemented
ข้อยกเว้นหากคุณไม่ได้ตั้งค่า_read
มันจะไม่ผิดพลาดภายในฟังก์ชันหรือสคริปต์หากความไม่สอดคล้องทำให้คุณ ประสาทรวมถึงnoop
.)
_read
วิธีการดึงข้อมูลจากแหล่งข้อมูลพื้นฐาน"
null
เข้าไปในบัฟเฟอร์ของกระแส
null
บอกกระแสว่าได้อ่านข้อมูลทั้งหมดเสร็จแล้วและปิดสตรีม
readable.push()
วิธีการนี้ถูกเรียกใช้โดยผู้ปฏิบัติงานที่อ่านได้เท่านั้นและจากภายในreadable._read()
วิธีการเท่านั้น”
อย่าใช้คำตอบที่นับใหม่ของ 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
นี่ควรเป็นสตรีมแบบอ่านได้ที่เข้ากันได้อย่างสมบูรณ์ ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้สตรีมอย่างเหมาะสม
คำตอบเก่า : เพียงใช้สตรีม 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
})
โปรดทราบว่าเหตุการณ์ 'ปิด' ไม่ได้ถูกปล่อยออกมา (ซึ่งไม่ได้ต้องการโดยอินเตอร์เฟสของสตรีม)
เพียงแค่สร้างอินสแตนซ์ใหม่ของ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');
pipe()
อย่างน้อยควรจะส่งกระแสข้อมูลปลายทาง
แก้ไข: คำตอบของ Garthน่าจะดีกว่า
ข้อความคำตอบเดิมของฉันถูกเก็บไว้ด้านล่าง
ในการแปลงสตริงเป็นสตรีมคุณสามารถใช้หยุดชั่วคราวผ่านสตรีม:
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()
resumer
ทำงานได้ค่อนข้างดี ขอบคุณ!
มีโมดูลสำหรับที่: https://www.npmjs.com/package/string-to- สตรีม
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)
โซลูชันอื่นกำลังส่งผ่านฟังก์ชันการอ่านไปยังตัวสร้างของ Readable ( ตัวเลือก readeable cf doc stream )
var s = new Readable({read(size) {
this.push("your string here")
this.push(null)
}});
คุณสามารถใช้ s.pipe ได้หลังจากเป็นตัวอย่าง
ฉันเบื่อที่จะต้องเรียนรู้สิ่งนี้ใหม่ทุก ๆ หกเดือนดังนั้นฉันจึงเพิ่งตีพิมพ์โมดูล 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
ที่ต้องส่งผ่านไปยัง Constructor เมื่อทำการเรียกใช้และจะถูกส่งออกโดยกระแสข้อมูลในรูปของข้อมูล options
เป็นตัวเลือกที่ทั่วไปที่อาจจะถูกส่งผ่านไปยังกระแสต่อเอกสาร
ตาม 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 ของสตรีมที่อ่านได้มันจะทำงานได้ดี ในความเป็นจริงคุณอาจไม่สามารถใช้วิธีการเหล่านั้นส่วนใหญ่หรือเพียงแค่ปล่อยให้พวกเขาเป็นไม่สมบูรณ์; สิ่งที่คุณต้องใช้คือสิ่งที่ห้องสมุดใช้ คุณสามารถใช้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()
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
เมื่อฉันใช้มันnew StringStream(str).send()
stream.Readable
like @Garth Kidd
stream.Readable
ไม่มีตัวตนเมื่อฉันเขียนคำตอบนี้