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

p1iqtdky  于 2023-06-22  发布在  Node.js
关注(0)|答案(4)|浏览(154)

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

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

nhn9ugyo

nhn9ugyo1#

我建议在前面加上分隔符,这样你就可以在第一次调用后动态地调整它:

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

r1zk6ea12#

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

sy5wg1nm3#

被接受的答案很有趣(前置分隔符),但在我的例子中,我发现附加分隔符并删除文件的最后一个字符更容易,就像问题中建议的那样。

Node.js删除文件的最后一个字符:

import fs from 'fs'

async function removeLastCharacter(filename) {
  const stat = await fs.promises.stat(filename)
  const fileSize = stat.size

  await fs.promises.truncate(filename, fileSize - 1)
}

说明:

  • fs.promises.stat给了我们一些关于文件的信息,我们将使用它的size
  • fs.promises.truncate从文件中删除某个位置之后的内容
  • 我们使用位置fileSize - 1,这是最后一个字符。
    **注意:**是的,我知道我们需要等到流关闭,但这是可以的,因为truncatestat函数非常快,不依赖于文件大小,它们不必读取其内容。
lnvxswe2

lnvxswe24#

这里有一个包含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.');

相关问题