[英]Removing the last character from file stream in node.js (fs module)
使用 node.js,我正在嘗試構建一個對象數組並將它們寫入文件。 為此,我使用了內置的 fs 庫。
調用var file = fs.createWriteStream('arrayOfObjects.json');
和file.write('[')
我運行幾個異步函數最終 append 對象是這樣的:
file.write(JSON.stringify(objectToAppend) + ',\n')
我可以確定所有對象何時停止附加,這就是我運行file.write(']')
和file.end()
的地方。 我的問題是將最后一個逗號添加到最后一個 object 導致 JSON 無效。
由於腳本的異步特性,很難確定最后一個 object 的創建位置和時間,所以我想知道是否有辦法從文件流中刪除或刪除字符。 如果是這樣,我可以在添加最后一個']'
字符之前執行此操作。
我可以手動執行此操作,但我希望將 pipe 用於另一個應用程序。 我想到的唯一解決方案是使用fs.truncate()
function,但這似乎不適用於文件流,並且file.length
或file.length()
都不會給我內容的長度,因為它不是字符串,因此很難確定截斷文件的方式或位置。
現在我剛剛在數組末尾添加了'{}]'
以使其有效 JSON,但是這個空的 object 可能會在以后引起一些問題。
另請注意:我在此 stream 中寫入的對象數組非常大,因此我寧願不結束 stream 並重新打開文件。
我建議先添加分隔符,以便在第一次調用后動態調整它:
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.');
接受的答案很有趣(在分隔符前面),但在我的情況下,我發現 append 分隔符並刪除文件的最后一個字符更容易,正如問題中所建議的那樣。
這是使用 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
從文件中刪除某個 position 之后的內容fileSize - 1
是最后一個字符。 注意:是的,我知道我們需要等到 stream 關閉,但這沒關系,因為truncate
和stat
函數非常快並且不依賴於文件大小,它不必讀取其內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.