Używam biblioteki ya-csv , która oczekuje pliku lub strumienia jako danych wejściowych, ale mam ciąg.
Jak przekonwertować ten ciąg na strumień w Node?
źródło
Używam biblioteki ya-csv , która oczekuje pliku lub strumienia jako danych wejściowych, ale mam ciąg.
Jak przekonwertować ten ciąg na strumień w Node?
W węźle 10.17 stream.Readable mają from
metodę łatwego tworzenia strumieni z dowolnej iterowalnej (która obejmuje literały tablicowe):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
Zauważ, że przynajmniej między 10.17 a 12.3, łańcuch sam w sobie jest iterowalny, więc Readable.from("input string")
będzie działał, ale emituje jedno zdarzenie na znak. Readable.from(["input string"])
wyemituje jedno zdarzenie na pozycję w tablicy (w tym przypadku jeden element).
Zwróć również uwagę, że w późniejszych węzłach (prawdopodobnie 12.3, ponieważ dokumentacja mówi, że funkcja została wówczas zmieniona), nie jest już konieczne zawijanie łańcucha w tablicę.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
Ponieważ @substack poprawił mnie w #node , nowe API strumieni w Node v10 ułatwia to:
... po którym można swobodnie rura to lub w inny sposób przekazać go do zamierzonego odbiorcy.
Nie jest tak czysty, jak jednolinijkowy resumer , ale pozwala uniknąć dodatkowej zależności.
( Aktualizacja: do tej pory w wersjach od 10.10.26 do 9.2.1 wywołanie
push
bezpośrednio z zachęty REPL ulegnie awarii znot implemented
wyjątkiem, jeśli nie zostało to ustawione_read
. Nie nastąpi awaria wewnątrz funkcji lub skryptu. Jeśli niespójność powoduje, że nerwowy, obejmująnoop
.)źródło
_read
metodę pobierania danych z podstawowego zasobu”.null
się do bufora strumienia?null
informuje strumień, że zakończył odczytywanie wszystkich danych i zamknięcie strumieniareadable.push()
Metoda ma być wywoływana tylko przez czytelne implementacje i tylko z poziomureadable._read()
metody”.Nie używaj odpowiedzi resumeru Jo Liss. W większości przypadków zadziała, ale w moim przypadku straciłem dobre 4 lub 5 godzin na znajdowanie błędów. Nie ma do tego potrzeby stosowania modułów innych firm.
NOWA ODPOWIEDŹ :
Powinien to być w pełni zgodny czytelny strumień. Zobacz tutaj, aby uzyskać więcej informacji na temat prawidłowego korzystania ze strumieni.
STARE ODPOWIEDŹ : Po prostu użyj natywnego strumienia PassThrough:
Należy zauważyć, że zdarzenie „close” nie jest emitowane (co nie jest wymagane przez interfejsy strumieniowe).
źródło
Po prostu utwórz nową instancję
stream
modułu i dostosuj ją do swoich potrzeb:lub
źródło
pipe()
ma przynajmniej zwrócić strumień docelowy.Edycja: odpowiedź Gartha jest prawdopodobnie lepsza.
Mój stary tekst odpowiedzi został zachowany poniżej.
Aby przekonwertować ciąg do strumienia, można użyć wstrzymane przez strumień:
Przykład:
źródło
resumer
działało całkiem dobrze. Dzięki!Jest do tego moduł: https://www.npmjs.com/package/string-to-stream
źródło
w skrypcie kawowym:
Użyj tego:
źródło
Innym rozwiązaniem jest przekazanie funkcji read do konstruktora Readable (patrz opcje readeable w strumieniu doc )
możesz po użyciu na przykład s.pipe
źródło
Zmęczyło mnie konieczność ponownego uczenia się tego co sześć miesięcy, więc właśnie opublikowałem moduł npm, aby wyodrębnić szczegóły implementacji:
https://www.npmjs.com/package/streamify-string
To jest sedno modułu:
str
jest tym,string
co musi zostać przekazane do konstruktora przy wywołaniu i zostanie wyprowadzone przez strumień jako dane.options
są typowymi opcjami, które można przekazać do strumienia, zgodnie z dokumentacją .Według Travisa CI powinien być kompatybilny z większością wersji node.
źródło
Oto uporządkowane rozwiązanie w języku TypeScript:
źródło
JavaScript jest wpisywany przez kaczkę, więc jeśli po prostu skopiujesz interfejs API strumienia czytelnego , będzie działał dobrze. W rzeczywistości, większości z tych metod prawdopodobnie nie da się zaimplementować lub po prostu pozostawić je jako kody pośredniczące; wszystko, co musisz zaimplementować, to to, czego używa biblioteka. Możesz użyć wstępnie zbudowanej
EventEmitter
klasy Node, aby radzić sobie ze zdarzeniami, więc nie musisz sam implementowaćaddListener
i tego typu rzeczy .Oto jak możesz to zaimplementować w CoffeeScript:
Wtedy możesz go użyć w ten sposób:
źródło
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
kiedy używam go jaknew StringStream(str).send()
stream.Readable
taką jak zasugerował @Garth Kidd.stream.Readable
nie istniało, kiedy pisałem tę odpowiedź.