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

时间:2015-06-17 19:54:03

标签: javascript json node.js string fs

使用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.lengthfile.length()都不会给我一个长度。内容因为它不是字符串所以很难确定截断文件的方式或位置。

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

同样注意:我在此流中编写的对象数组非常大,所以我宁愿不结束流并重新打开文件

3 个答案:

答案 0 :(得分:15)

我建议先添加分隔符,以便在第一次调用后动态调整它:

#0  0x00007ffff7834517 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1  0x00007ffff7830f60 in atoi () from /lib/x86_64-linux-gnu/libc.so.6
#2  0x0000000000401258 in subExec () at cm.c:138
#3  0x00007ffff7bc4182 in start_thread () from /lib/x86_64-linux-gnu/libpthread.so.0
#4  0x00007ffff78f147d in clone () from /lib/x86_64-linux-gnu/libc.so.6

答案 1 :(得分:2)

使用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();

答案 2 :(得分:0)

这是一个包含robertklep答案的摘录。这将从管道分隔文件转换为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.');