因此,您正在从文件读取数据,清除数据并将其写回到另一个文件,但是新文件不接受JSON格式。
您需要在新文件中填充一个对象。您可以从文件中获取大块,对其进行更改,然后将其保存到新文件中。
为此,您可以将数据流传输出去,编辑块,然后将其流回到另一个文件中。很好。
您一定要在每个项目之后添加,
,以便以后可以读取数组,
但现在最后一项的末尾有逗号,
...
您不知道原始文件中的项目数,也不知道阅读器何时位于最后一个项目。
在该数组上使用类似JSONStream的东西,但是JSONStream
也未提供索引。
唯一的结束事件是针对您的writers
和readers
的。
如何在写之前/之后删除结尾的逗号?
read_file = 'animals.json' //very large file
write_file = 'brown_dogs.json' //moderately large file
let read_stream = fs.createReadStream(read_file);
let write_stream = fs.createWriteStream(write_file);
let dog_stream = require('JSONStream').parse('array_of_animals.dogs.*');
write_stream
.on('finish', () => {
//the writer is done writing my list of dogs, but my array has a
//trailing comma, now my brown_dogs.json isn't parsable
})
.write('{"brown_dogs": ['); //lets start
read_stream
.pipe(dog_stream)
.on('data', dog => {
//basic logic before we save the item
if (dog._fur_colour === 'brown'){
let _dog = {
type : dog._type,
colour : dog._fur_colour,
size : dog._height
}
};
//we write our accepted dog
write_stream.write(JSON.stringify(_dog) + ',');
}
})
.on('end', () => {
//done reading animals.json
write_stream.write(']}');
})
-
如果生成的JSON文件很小,则可以简单地将所有狗添加到数组中,并且一次性将所有内容保存到文件中。这意味着该文件不仅是JSON友好的,而且足够小,可以简单地通过JSON.parse()
如果生成的JSON文件很大,则在任何情况下都可能需要流式传输项目。幸运的是,JSONStream
使我们不仅可以单独提取每条狗,还可以忽略尾随的逗号。
这就是我所理解的解决方案……但我认为这并不完美。无论大小如何,为什么文件都不能接受JSON。
答案 0 :(得分:0)
我认为
我为此在toJSONArray
see docs here中添加了scramjet
方法。它仅在各块之间放置一个逗号。
代码如下:
fs.createReadStream(read_file)
.pipe(require('JSONStream').parse('array_of_animals.dogs.*'))
.pipe(new DataStream())
.filter(dog => dog._fur_colour === 'brown') // this will filter out the non-brown dogs.
.map(dog => { // remap the data
reutrn {
type : dog._type,
colour : dog._fur_colour,
size : dog._height
};
})
.toJSONArray(['{"brown_dogs": [', ']}']) // add your enclosure
.pipe(fs.createWriteStream(write_file));
这段代码应该可以制作出精美的JSON。
答案 1 :(得分:0)
这实际上很简单。
将一个空字符串var
添加到插入的开头。第一次插入后,将字符串设置为分隔符。
//update this string after the first insert
let separator = '';
read_stream
.pipe(dog_stream)
.on('data', dog => {
//basic logic before we save the item
if (dog._fur_colour === 'brown'){
let _dog = {
type : dog._type,
colour : dog._fur_colour,
size : dog._height
}
};
//we write our accepted dog
write_stream.write(separator + JSON.stringify(_dog));
//update this after first insert
separator = ',';
}
})