簡體   English   中英

使用 Node.js 將對象寫入文件

[英]Write objects into file with Node.js

我已經在整個stackoverflow/google上搜索過這個,但似乎無法弄清楚。

我正在抓取給定 URL 頁面的社交媒體鏈接,該函數返回一個帶有 URL 列表的對象。

當我嘗試將此數據寫入不同的文件時,它會以[object Object]而不是預期的形式輸出到文件中:[ ' https://twitter.com/#!/101Cookbooks ', ' http://www. facebook.com/101cookbooks '] 就像我console.log()結果一樣。

這是我在 Node 中讀取和寫入文件的可悲嘗試,嘗試讀取每一行(url)並通過函數調用request(line, gotHTML)

fs.readFileSync('./urls.txt').toString().split('\n').forEach(function (line){
    console.log(line); 
    var obj = request(line, gotHTML); 
    console.log(obj); 
    fs.writeFileSync('./data.json', obj , 'utf-8'); 
});   

供參考—— gotHTML函數:

function gotHTML(err, resp, html){ 
    var social_ids = []; 

    if(err){
        return console.log(err); 
    } else if (resp.statusCode === 200){ 
        var parsedHTML = $.load(html); 

        parsedHTML('a').map(function(i, link){
            var href = $(link).attr('href');
            for(var i=0; i<socialurls.length; i++){
                if(socialurls[i].test(href) && social_ids.indexOf(href) < 0 ) {
                    social_ids.push(href); 
                }; 
            }; 
        })
    };

    return social_ids;
};

在 deb2fast 所說的基礎上,我還將向 JSON.stringify() 傳遞幾個額外的參數以使其具有漂亮的格式:

fs.writeFileSync('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');

第二個參數是一個可選的替換函數,在這種情況下你不需要它,所以null有效。

第三個參數是用於縮進的空格數。 2 和 4 似乎是流行的選擇。

obj在您的示例中是一個數組。

fs.writeFileSync(filename, data, [options])在 data 參數中需要StringBuffer 請參閱文檔

嘗試以字符串格式編寫數組:

// writes 'https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8'); 

或者:

// writes ['https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks']
var util = require('util');
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8');

編輯:您在示例中看到數組的原因是因為 node 的console.log實現不只是調用toString ,它調用util.format 參見 console.js 源

如果你得到[object object]然后使用JSON.stringify

fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');

它對我有用。

根據我的經驗,JSON.stringify 比 util.inspect 稍快。 我不得不將 DB2 查詢的結果對象保存為 json 文件,該查詢返回了一個 92k 行的對象,使用 util.inspect 轉換需要很長時間才能完成,因此我通過編寫相同的 1000 條記錄對象進行了以下測試到具有這兩種方法的文件。

  1. JSON.Stringify

     fs.writeFile('./data.json', JSON.stringify(obj, null, 2));

時間:3:57(3分57秒)

結果格式:

[
  {
    "PROB": "00001",
    "BO": "AXZ",
    "CNTRY": "649"
   },
  ...
]
  1. 實用程序檢查

    var util = require('util'); fs.writeFile('./data.json', util.inspect(obj, false, 2, false));

時間:4:12(4分12秒)

結果格式:

[ { PROB: '00001',
    BO: 'AXZ',
    CNTRY: '649' },
    ...
]

你可以嘗試做 JSON.stringify(obj);

像這樣

 var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8'); 

以防萬一其他人偶然發現這一點,我在節點中使用 fs-extra 庫並將 javascript 對象寫入這樣的文件:

const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile); 

進一步@Jim Schubert@deb2fast的回答:

為了能夠寫出大於~100 MBobjects ,您需要使用 for...of ,如下所示並符合您的要求。

 const fsPromises = require('fs').promises; const sampleData = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"}; const writeToFile = async () => { for (const dataObject of Object.keys(sampleData)) { console.log(sampleData[dataObject]); await fsPromises.appendFile( "out.json" , dataObject +": "+ JSON.stringify(sampleData[dataObject])); } } writeToFile();

有關node.js限制的完整參考,請參閱https://stackoverflow.com/a/67699911/3152654

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM