在 nodeJs 中,如何使用 stream-json 中的管道写入文件?
How do I use the pipeline from stream-json to write to file, in nodeJs?
我正在尝试使用 stream-json 读取 zip、解压缩,然后将其写入文件。我不认为我了解如何使用该库。
基于上面的link,他们有这个例子:
const {chain} = require('stream-chain');
const {parser} = require('stream-json');
const {pick} = require('stream-json/filters/Pick');
const {ignore} = require('stream-json/filters/Ignore');
const {streamValues} = require('stream-json/streamers/StreamValues');
const fs = require('fs');
const zlib = require('zlib');
const pipeline = chain([
fs.createReadStream('sample.json.gz'),
zlib.createGunzip(),
parser(),
pick({filter: 'data'}),
ignore({filter: /\b_meta\b/i}),
streamValues(),
data => {
const value = data.value;
// keep data only for the accounting department
return value && value.department === 'accounting' ? data : null;
}
]);
let counter = 0;
pipeline.on('data', () => ++counter);
pipeline.on('end', () =>
console.log(`The accounting department has ${counter} employees.`));
但是我不想统计任何东西,我只想写入文件。这是我的作品:
function unzipJson() {
const zipPath = Path.resolve(__dirname, 'resources', 'AllPrintings.json.zip');
const jsonPath = Path.resolve(__dirname, 'resources', 'AllPrintings.json');
console.info('Attempting to read zip');
return new Promise((resolve, reject) => {
let error = null;
Fs.readFile(zipPath, (err, data) => {
error = err;
if (!err) {
const zip = new JSZip();
zip.loadAsync(data).then((contents) => {
Object.keys(contents.files).forEach((filename) => {
console.info(`Writing ${filename} to disk...`);
zip.file(filename).async('nodebuffer').then((content) => {
Fs.writeFileSync(jsonPath, content);
}).catch((writeErr) => { error = writeErr; });
});
}).catch((zipErr) => { error = zipErr; });
resolve();
} else if (error) {
console.log(error);
reject(error);
}
});
});
}
但是我不能轻易地对此添加任何处理,所以我想用 stream-json
替换它。这是我的部分尝试,因为我不知道如何完成:
function unzipJson() {
const zipPath = Path.resolve(__dirname, 'resources', 'myfile.json.zip');
const jsonPath = Path.resolve(__dirname, 'resources', 'myfile.json');
console.info('Attempting to read zip');
const pipeline = chain([
Fs.createReadStream(zipPath),
zlib.createGunzip(),
parser(),
Fs.createWriteStream(jsonPath),
]);
// use the chain, and save the result to a file
pipeline.on(/*what goes here?*/)
稍后我打算添加对 json 文件的额外处理,但我想在开始投入额外功能之前学习基础知识。
不幸的是,我无法生成一个最小示例,因为我不知道 pipeline.on
函数中包含什么。我试图了解我应该做什么,而不是我做错了什么。
我也看了相关的stream-chain
,里面有一个这样结尾的例子:
// use the chain, and save the result to a file
dataSource.pipe(chain).pipe(fs.createWriteStream('output.txt.gz'));`
但是文档根本没有解释 dataSource
的来源,我认为我的链是通过读取文件中的 zip 创建它自己的?
我应该如何使用这些流媒体库写入文件?
I don't want to count anything, I just want to write to file
在这种情况下,您需要将 token/JSON 数据流转换回可写入文件的文本流。您可以为此使用图书馆的 Stringer
。它的文档也包含一个例子,似乎更符合你想做的事情:
chain([
fs.createReadStream('data.json.gz'),
zlib.createGunzip(),
parser(),
pick({filter: 'data'}), // omit this if you don't want to do any processing
stringer(),
zlib.Gzip(), // omit this if you want to write an unzipped result
fs.createWriteStream('edited.json.gz')
]);
我正在尝试使用 stream-json 读取 zip、解压缩,然后将其写入文件。我不认为我了解如何使用该库。
基于上面的link,他们有这个例子:
const {chain} = require('stream-chain');
const {parser} = require('stream-json');
const {pick} = require('stream-json/filters/Pick');
const {ignore} = require('stream-json/filters/Ignore');
const {streamValues} = require('stream-json/streamers/StreamValues');
const fs = require('fs');
const zlib = require('zlib');
const pipeline = chain([
fs.createReadStream('sample.json.gz'),
zlib.createGunzip(),
parser(),
pick({filter: 'data'}),
ignore({filter: /\b_meta\b/i}),
streamValues(),
data => {
const value = data.value;
// keep data only for the accounting department
return value && value.department === 'accounting' ? data : null;
}
]);
let counter = 0;
pipeline.on('data', () => ++counter);
pipeline.on('end', () =>
console.log(`The accounting department has ${counter} employees.`));
但是我不想统计任何东西,我只想写入文件。这是我的作品:
function unzipJson() {
const zipPath = Path.resolve(__dirname, 'resources', 'AllPrintings.json.zip');
const jsonPath = Path.resolve(__dirname, 'resources', 'AllPrintings.json');
console.info('Attempting to read zip');
return new Promise((resolve, reject) => {
let error = null;
Fs.readFile(zipPath, (err, data) => {
error = err;
if (!err) {
const zip = new JSZip();
zip.loadAsync(data).then((contents) => {
Object.keys(contents.files).forEach((filename) => {
console.info(`Writing ${filename} to disk...`);
zip.file(filename).async('nodebuffer').then((content) => {
Fs.writeFileSync(jsonPath, content);
}).catch((writeErr) => { error = writeErr; });
});
}).catch((zipErr) => { error = zipErr; });
resolve();
} else if (error) {
console.log(error);
reject(error);
}
});
});
}
但是我不能轻易地对此添加任何处理,所以我想用 stream-json
替换它。这是我的部分尝试,因为我不知道如何完成:
function unzipJson() {
const zipPath = Path.resolve(__dirname, 'resources', 'myfile.json.zip');
const jsonPath = Path.resolve(__dirname, 'resources', 'myfile.json');
console.info('Attempting to read zip');
const pipeline = chain([
Fs.createReadStream(zipPath),
zlib.createGunzip(),
parser(),
Fs.createWriteStream(jsonPath),
]);
// use the chain, and save the result to a file
pipeline.on(/*what goes here?*/)
稍后我打算添加对 json 文件的额外处理,但我想在开始投入额外功能之前学习基础知识。
不幸的是,我无法生成一个最小示例,因为我不知道 pipeline.on
函数中包含什么。我试图了解我应该做什么,而不是我做错了什么。
我也看了相关的stream-chain
,里面有一个这样结尾的例子:
// use the chain, and save the result to a file
dataSource.pipe(chain).pipe(fs.createWriteStream('output.txt.gz'));`
但是文档根本没有解释 dataSource
的来源,我认为我的链是通过读取文件中的 zip 创建它自己的?
我应该如何使用这些流媒体库写入文件?
I don't want to count anything, I just want to write to file
在这种情况下,您需要将 token/JSON 数据流转换回可写入文件的文本流。您可以为此使用图书馆的 Stringer
。它的文档也包含一个例子,似乎更符合你想做的事情:
chain([
fs.createReadStream('data.json.gz'),
zlib.createGunzip(),
parser(),
pick({filter: 'data'}), // omit this if you don't want to do any processing
stringer(),
zlib.Gzip(), // omit this if you want to write an unzipped result
fs.createWriteStream('edited.json.gz')
]);