使用node.js,我试图构建一个对象数组并将它们写入文件。为此,我使用内置的fs库。
在调用var file = fs.createWriteStream('arrayOfObjects.json');
和file.write('[')
之后,我运行了几个异步函数,最终像这样附加对象:file.write(JSON.stringify(objectToAppend) + ',\n')
我可以确定所有对象何时停止追加,这就是我运行file.write(']')
和file.end()
的地方。* 我的问题是在最后一个对象的末尾添加最后一个逗号会导致JSON无效。*
由于脚本的异步特性,很难确定最后一个对象是在何时何地创建的,所以我想知道是否有一种方法可以从文件流中剥离或删除字符。如果是这样,我可以在添加最后一个']'
字符之前完成此操作。
我可以手动完成这项工作,但我希望通过管道将其传输到另一个应用程序。我想到的唯一解决方案是使用fs.truncate()
函数,但这似乎不适用于文件流,file.length
或file.length()
都不会给予我内容的长度,因为它不是字符串,所以很难确定如何或在何处截断文件。
现在我只是在数组的末尾添加了'{}]'
,以使其成为有效的JSON,但是这个空对象可能会在以后引起一些问题。
注:我在这个流中写入的对象数组非常大,所以我宁愿不结束流并重新打开文件。
4条答案
按热度按时间nhn9ugyo1#
我建议在前面加上分隔符,这样你就可以在第一次调用后动态地调整它:
r1zk6ea12#
使用
JSONStream
的示例:sy5wg1nm3#
被接受的答案很有趣(前置分隔符),但在我的例子中,我发现附加分隔符并删除文件的最后一个字符更容易,就像问题中建议的那样。
Node.js删除文件的最后一个字符:
说明:
fs.promises.stat
给了我们一些关于文件的信息,我们将使用它的size
。fs.promises.truncate
从文件中删除某个位置之后的内容fileSize - 1
,这是最后一个字符。**注意:**是的,我知道我们需要等到流关闭,但这是可以的,因为
truncate
和stat
函数非常快,不依赖于文件大小,它们不必读取其内容。lnvxswe24#
这里有一个包含robertklep答案的片段。这将从管道分隔的文件转换为json: