Итак, у меня есть текстовый файл с кодировкой ISO-8859-1
, хранящийся в лазурном блобе, который мне нужно обрабатывать построчно, используя поток, поскольку файлы могут быть довольно большими.
Я гарантировал, чтоcontentEncoding для загруженного большого двоичного объекта корректен и пробовал различные настройки, такие как ISO-8859-1
, latin1, binary, ...
Я могу загрузить файл на диск, как это, и кодировка загруженного файла восстанавливается локально просто отлично:
const stream = require('stream');
const storage = require('azure-storage');
const blobService = storage.createBlobService();
const containerName = 'myContainer';
const file = 'in.txt';
let readable = blobService.createReadStream(containerName, file, {encoding: 'latin1'});
let outstream = fs.createWriteStream('./out.txt');
readable.pipe(outstream);
То, что я на самом деле хочу сделать вместо загрузки файла на диск, - это работать через поток с readline
, анализируя файл при поступлении данных:
const stream = require('stream');
const storage = require('azure-storage');
const blobService = storage.createBlobService();
const containerName = 'myContainer';
const file = 'in.txt';
let readable = blobService.createReadStream(containerName, file, {encoding: 'latin1'});
readable.setEncoding('latin1');
let rl = readline.createInterface(readable);
rl.on('line', function(line) {
console.log('line: ' + line);
});
rl.on('close', function() {
console.log('Stream closed.');
});
Вышеупомянутый код не будет работать, но вернет ошибку:
TypeError: readable.setEncoding is not a function
Когда я опускаю setEncoding
, поток будет обработан readline просто отлично, но кодировка неправильная.
Я также попробовал Azure getBlobText
(хотя это действительно не то, что я хочу), который не сможет проверить contentMD5
и вернет ошибку для файлов, содержащих латинские символы:
Error: Hash mismatch (integrity check failed), Expected value is jd2+sYDibe5GCw5JwpMhpg==, retrieved q/IlYBBNY6XluFzKKPq7hw==.
at BlobService._validateLengthAndMD5
Как сделатьявыйти из этого, не загружая файл на диск?