从node.js(fs模块)中的文件stream中删除最后一个字符

使用node.js,我试图build立一个对象数组,并将其写入一个文件。 为此,我使用内置的fs库。

在调用var file = fs.createWriteStream('arrayOfObjects.json');file.write('[')我运行了几个asynchronous函数,最终追加这样的对象:

file.write(JSON.stringify(objectToAppend) + ',\n')

我可以确定什么时候所有的对象都停止了追加,这是我运行file.write(']')file.end()我的问题是添加最后一个对象的最后一个逗号导致JSON无效。

由于脚本的asynchronous性质,确定何时何地创build最后一个对象是非常困难的,所以我想知道是否有办法从文件stream中去除或删除字符。 如果是这样,我可以在添加最后的']'字符之前做到这一点。

我可以手动执行此操作,但是我希望将其传送给另一个应用程序。 我想过的唯一的解决scheme是使用fs.truncate()函数,但是这似乎不适用于文件stream, file.lengthfile.length()将给我的内容的长度,因为它不是一个string,所以很难确定如何或在哪里截断文件。

现在我刚刚在数组的末尾添加了'{}]' ,以使其成为有效的JSON,但这个空对象稍后可能会导致一些问题。

另外请注意:我在这个stream中写入的对象数组非常大,所以我宁愿不要结束stream并重新打开文件

我build议预先放置分隔符,以便在第一次调用之后dynamic地调整它:

 file.write('[\n') var sep = ""; forEach(function(objectToAppen) { file.write(sep + JSON.stringify(objectToAppend)) if (!sep) sep = ",\n"; }); 

使用JSONStream示例:

 var JSONStream = require('JSONStream'); var fs = require('fs'); var jsonwriter = JSONStream.stringify(); var file = fs.createWriteStream('arrayOfObjects.json'); // Pipe the JSON data to the file. jsonwriter.pipe(file); // Write your objects to the JSON stream. jsonwriter.write({ foo : 'bar#1' }); jsonwriter.write({ foo : 'bar#2' }); jsonwriter.write({ foo : 'bar#3' }); jsonwriter.write({ foo : 'bar#4' }); // When you're done, end it. jsonwriter.end(); 

这是一个结合robertklep的答案的片段。 这从pipe道分离的文件转换为json:

 var fs = require('fs'); var readline = require('readline'); var JSONStream = require('JSONStream'); // Make sure we got a filename on the command line. if (process.argv.length < 3) { console.log('Usage: node ' + process.argv[1] + ' FILENAME'); process.exit(1); } var filename = process.argv[2]; var outputFilename = filename + '.json'; console.log("Converting psv to json. Please wait."); var jsonwriter = JSONStream.stringify(); var outputFile = fs.createWriteStream(outputFilename); jsonwriter.pipe(outputFile); var rl = readline.createInterface({ input: fs.createReadStream(filename), terminal: false }).on('line', function(line) { console.log('Line: ' + line); if(!/ADDRESS_DETAIL_PID/.test(line)) { var split = line.split('|'); var line_as_json = { "address_detail_pid": split[0], "flat_type": split[1], "flat_number": split[2], "level_type": split[3], "level_number": split[4], "number_first": split[5], "street_name": split[6], "street_type_code": split[7], "locality_name": split[8], "state_abbreviation": split[9], "postcode": split[10], "longitude": split[11], "latitude": split[12] }; jsonwriter.write(line_as_json); } }).on('close', () => { jsonwriter.end(); });; console.log('psv2json complete.');