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

Javascript 从node.js(fs模块)中的文件流中删除最后一个字符,javascript,json,node.js,string,fs,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()。我的问题是,在最后一个对象的

使用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,但是这个空对象可能会在以后引起一些问题


另外注意:我在此流中写入的对象数组非常大,因此我不希望结束流并重新打开文件

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

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


下面是一段作者的答案。这将从管道分隔文件转换为json:

var fs=require('fs');
var readline=require('readline');
var JSONStream=require('JSONStream');
//确保命令行上有文件名。
如果(进程argv.length<3){
log('Usage:node'+process.argv[1]+'FILENAME');
过程。退出(1);
}
var filename=process.argv[2];
var outputFilename=filename+'.json';
log(“正在将psv转换为json。请稍候”);
var jsonwriter=JSONStream.stringify();
var outputFile=fs.createWriteStream(outputFilename);
jsonwriter.pipe(outputFile);
var rl=readline.createInterface({
输入:fs.createReadStream(文件名),
终端:错误
}).on('line',函数(line){
console.log('行:'+行);
如果(!/ADDRESS\u DETAIL\u PID/.test(行))
{     
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],“Location_name:split[8],“state_缩写”:split[9],“postcode:split[10],“Latitudent:split[11],“纬度”:split[12]};
write(行作为json);
}    
}).on('关闭',()=>{
jsonwriter.end();
});;
log('psv2json complete');

也许您应该通过检查附加的对象是否是最后一个对象来解决问题。如果是,请省略逗号。这比猜测流何时结束并截断最后一个字符要容易得多。虽然我通常会这么做,但我正在运行一个相对复杂的脚本,其中包含多个包含异步函数的for循环。因此,在每次运行时,不仅最后一个对象可能会不同,而且很难确定该对象是否是创建时的最后一个对象。您是否找到了剥离最后一个逗号的解决方案?我也有同样的问题。非常简单的解决方案,谢谢。仍然想知道如何去除最后一个字符。@mgmcdermott您不需要去除最后一个字符,它是预先设置好的,因此流永远不会以逗号结束。@mgmcdermott:我想您需要一个缓冲区(大小为1)。将接收到的每个元素存储在其中,并在填充缓冲区时将“previous”元素写入
文件。然后在流的末尾,您将拥有缓冲区中的最后一个元素,并且可以在不使用尾随分隔符(或任何其他特殊处理)的情况下写入它。@PatrickRoberts I有点不清楚。我知道这是对剥离最后一个角色的替代,我觉得不去想它有点愚蠢,但是像Bergi在上面的评论中那样的解决方案将是解决原始问题的好方法。
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();