Можно ли завершить чанки потоков Node определенным символом?
У меня довольно большой XML-файл, который я передаю в функцию, например:
var stream = fs.createReadStream(__dirname + '/File.xml').pipe(myfunction);
Содержимое функции, к которой передаются потоки, не очень важно, за исключением того, что оно разбивает поток на строки, которые я хочу и выполняю decodeURIComponent
на них. У меня проблема в том, что некоторые чанки заканчиваются частично через закодированные строки:
01 %E5%8A%87%E4%BC%B4%E7%89%%9E%8B1%E2%98%86%E6%A5%B5%E2%98%85%E6.csv
02 %E3%83%AA%E3%82%B9%E3%82%BC%B7%E5%8C%96%E5%9E%8B2%E2%98%86%E6.csv
03 %E6%97%A5%E5%8B3%E2%98%86%E6%A5%B5%E2%98%85%E6%9C%8D.csv
04 %E6%9C%8D%E7%9D%B1%9A%E5%9E%8B4%E2%98%86%E6%A5%B5%E2%98%85%E6%9C%8D.csv
05 %E5%90%8D%E4%BB%98%E6%89%87%E5%
Как вы можете видеть, окончательное имя файла обрезается частично через один из закодированных символов.
Можно ли принудительно завершить чанки потоков в определенных символах или группах регулярных выражений, например после .csv
? Я не нашел решения для этого в другом месте, что приводит меня к мысли, что я использую неправильный подход.
С другой стороны, я мог бы просто записать вывод каждого буфера в hugeString
и затем оперирую этим, но я чувствую, что это не совсем соответствует другим преимуществам потоков Node.
1 ответ
Вы не можете принудительно завершить собственные фрагменты потока в любой заданной точке (это то, что они из кода чтения потока), но вы можете создать свой собственный код, который читает поток и буферы, пока он не получит целый фрагмент, а затем вы может инициировать ваше собственное событие или обратный вызов, чтобы объявить, что у вас есть целая часть, или вы можете направить поток в поток преобразования, который разбивает его на строки для вас.
Вот хорошая статья о том, как поток преобразования работает для переноса строк (что, по-видимому, в основном та же концепция, о которой вы спрашиваете).