Estoy usando una biblioteca, ya-csv , que espera un archivo o una secuencia como entrada, pero tengo una cadena.
¿Cómo convierto esa cadena en una secuencia en Node?
fuente
Estoy usando una biblioteca, ya-csv , que espera un archivo o una secuencia como entrada, pero tengo una cadena.
¿Cómo convierto esa cadena en una secuencia en Node?
Desde el nodo 10.17, stream.Readable tiene un from
método para crear fácilmente streams desde cualquier iterable (que incluye literales de matriz):
const { Readable } = require("stream")
const readable = Readable.from(["input string"])
readable.on("data", (chunk) => {
console.log(chunk) // will be called once with `"input string"`
})
Tenga en cuenta que al menos entre 10.17 y 12.3, una cadena es en sí misma iterable, por Readable.from("input string")
lo que funcionará, pero emite un evento por carácter.Readable.from(["input string"])
emitirá un evento por elemento en la matriz (en este caso, un elemento).
También tenga en cuenta que en los nodos posteriores (probablemente 12.3, ya que la documentación dice que la función se cambió entonces), ya no es necesario envolver la cadena en una matriz.
https://nodejs.org/api/stream.html#stream_stream_readable_from_iterable_options
Como @substack me corrigió en #node , la nueva API de secuencias en el Nodo v10 lo hace más fácil:
... después de lo cual puede canalizarlo libremente o, de lo contrario, pasarlo a su consumidor previsto.
No es tan limpio como el resumen de una línea, pero evita la dependencia adicional.
( Actualización: desde la v0.10.26 hasta la v9.2.1 hasta ahora, una llamada
push
directa desde el indicador REPL se bloqueará con unanot implemented
excepción si no la configuró_read
. No se bloqueará dentro de una función o un script. Si la inconsistencia lo hace nervioso, incluye elnoop
.)fuente
_read
método para obtener datos del recurso subyacente".null
en el búfer de la secuencia?null
le dice a la transmisión que ha terminado de leer todos los datos y cerrar la transmisiónreadable.push()
método debe ser llamado solo por implementadores legibles, y solo desde dentro delreadable._read()
método".No use la respuesta del curriculum vitae de Jo Liss. Funcionará en la mayoría de los casos, pero en mi caso me perdió una buena búsqueda de errores de 4 o 5 horas. No hay necesidad de módulos de terceros para hacer esto.
NUEVA RESPUESTA :
Esto debería ser una transmisión legible totalmente compatible. Consulte aquí para obtener más información sobre cómo usar las transmisiones correctamente.
ANTIGUA RESPUESTA : Solo use la secuencia PassThrough nativa:
Tenga en cuenta que el evento 'close' no se emite (lo cual no es requerido por las interfaces de flujo).
fuente
Simplemente cree una nueva instancia del
stream
módulo y personalícela según sus necesidades:o
fuente
pipe()
se supone que devuelve la secuencia de destino, al menos.Editar: la respuesta de Garth es probablemente mejor.
Mi antiguo texto de respuesta se conserva a continuación.
Para convertir una cadena en una corriente, se puede utilizar una pausa a través de la secuencia:
Ejemplo:
fuente
resumer
funcionó bastante bien. ¡Gracias!Hay un módulo para eso: https://www.npmjs.com/package/string-to-stream
fuente
en cafe-script:
úsalo:
fuente
Otra solución es pasar la función de lectura al constructor de Readable (cf opciones de lectura de flujo de documentos )
puede después de usar en la tubería por ejemplo
fuente
Me cansé de tener que volver a aprender esto cada seis meses, así que publiqué un módulo npm para abstraer los detalles de implementación:
https://www.npmjs.com/package/streamify-string
Este es el núcleo del módulo:
str
es lostring
que se debe pasar al constructor al invocarlo, y el flujo lo generará como datos.options
son las opciones típicas que se pueden pasar a una secuencia, según la documentación .Según Travis CI, debería ser compatible con la mayoría de las versiones de nodo.
fuente
Heres una solución ordenada en TypeScript:
fuente
JavaScript es de tipo pato, por lo que si solo copia una API legible , funcionará bien. De hecho, probablemente no pueda implementar la mayoría de esos métodos o simplemente dejarlos como apéndices; todo lo que necesitará implementar es lo que usa la biblioteca. Puedes usar el preconstruido de Node
EventEmitter
clase para lidiar con eventos, por lo que no tiene que implementaraddListener
usted mismo.A continuación, se explica cómo implementarlo en CoffeeScript:
Entonces podrías usarlo así:
fuente
TypeError: string is not a function at String.CALL_NON_FUNCTION (native)
cuando lo uso comonew StringStream(str).send()
stream.Readable
como la sugerida por @Garth Kidd.stream.Readable
no existía cuando escribí esta respuesta.