从 node.js 中的文件流中删除最后一个字符(fs 模块)
Removing the last character from file stream in node.js (fs module)
使用 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()
都不会给我长度contents 因为它不是字符串,所以很难确定如何或在哪里 t运行cate 文件。
目前我只是将'{}]'
添加到数组的末尾以使其有效JSON,但是这个空对象稍后可能会导致一些问题。
另外注意:我在这个流中写入的对象数组非常大,所以我宁愿不结束流并重新打开文件。
我建议改为在前面添加分隔符,以便您可以在第一次调用后动态调整它:
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 回答的片段。这将从管道分隔的文件转换为 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.');
使用 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()
都不会给我长度contents 因为它不是字符串,所以很难确定如何或在哪里 t运行cate 文件。
目前我只是将'{}]'
添加到数组的末尾以使其有效JSON,但是这个空对象稍后可能会导致一些问题。
另外注意:我在这个流中写入的对象数组非常大,所以我宁愿不结束流并重新打开文件。
我建议改为在前面添加分隔符,以便您可以在第一次调用后动态调整它:
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 回答的片段。这将从管道分隔的文件转换为 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.');