簡體   English   中英

如何在NodeJS和ExpressJS中將嵌套的JSON對象數組轉換為CSV

[英]How to Convert an array of Nested JSON Objects into CSV in NodeJS and ExpressJS

我想將CSV文件從服務器發送到客戶端。 我有通過ExpressJS Response從MongoDB獲取的JSON對象。

這是我的NodeJS代碼,該代碼正在接受來自客戶端的請求,該請求帶有主體中的Id和集合名稱參數,並作為響應,它獲取與這些Id相關的數據。

app.post('/api/v1/imagelist_data/raw-data/:db', function(req, res) {
    console.log("I received a NEW POST raw-data request");
    var dbname = req.params.db;

    var myarray = req.body._id;

    //  Setting Collection Name
    var mycollection = db.collection(dbname);

    // Convert the list of ids to mongo object ids
    var objectIds = myarray.map(function(item) {
        return mongojs.ObjectId(item);
    });

    console.log(objectIds);

    mycollection.find({
        _id: {
            $in: objectIds
        }
    }, function(err, docs) {

        res.json(docs);


    });

現在在客戶端獲取響應對象數組。 我想用這些對象數組制作一個CSV文件。

對象數組看起來像這樣。

[
{
    "_id": "58405524d70210dc299ca275",
    "pictureNumber": 1,
    "scAttitude": [
        0,
        0,
        0,
        1
    ],
    "scPosition": [
        1,
        0,
        0
    ],
    "integrationTime": 10,
    "time": "2016-12-01T16:51:57.000Z",
    "offset": 1,
    "gain": 2,
    "ledStatus": false,
    "imageType": "Image",
    "cameraType": "Mongo",
    "testPatternStatus": false,
    "temperatureCCD": 189,
    "temperatureLED1": 162,
    "temperatureLED2": 152,
    "temperatureVBG": 490,
    "temperatureGND": 0,
    "imageValid": true,
    "remarks": " Reception time: Thu Dec 01 17:51:47 CET 2016",
    "imageSize": 2271320
},
{
    "_id": "586bc534b31a89bb45b0083e",
    "pictureNumber": 2,
    "scAttitude": [
        1,
        0,
        0,
        1
    ],
    "scPosition": [
        1,
        0,
        0
    ],
    "integrationTime": 20,
    "time": "2016-12-02T16:51:57.000Z",
    "offset": 2,
    "gain": 0,
    "ledStatus": false,
    "imageType": "Image",
    "cameraType": "MOngo",
    "testPatternStatus": false,
    "temperatureCCD": 189,
    "temperatureLED1": 162,
    "temperatureLED2": 152,
    "temperatureVBG": 490,
    "temperatureGND": 0,
    "imageValid": true,
    "remarks": " Reception time: Thu Dec 01 17:51:47 CET 2016",
    "imageSize": 2271320
}]

我應該在服務器端還是客戶端進行此處理?

我想通過單擊按鈕在客戶端下載帶有數據的CSV文件。

我該如何實現?

您可以使用以下任一模塊:

(不必擔心是CSV還是TSV,只需確保使用正確的分隔符(用逗號分隔)即可)或這些列表中的其他內容:

與手動編寫正確的輸出相比,這更容易且更不容易出錯,尤其是當您有任何特殊字符時。

我的建議是在服務器端生成CSV文件,並將其作為附件返回給客戶端。 這種方法可確保CSV文件在所有設備(筆記本電腦/電話/表格/等)上都相同。 此外,還避免了在每個不同客戶端上重新創建CSV的實現。

在expressjs中使用csv文件的響應:

mycollection.find({
    _id: {
        $in: objectIds
    }
}, function(err, docs) {
    if (err) {
      res.status(400);
      res.send('Unexpected db error');
    }

    var csv = convertCollectionToCsv(docs);
    if (!csv) {
      res.status(400);
      res.send('Invalid csv format');
    }

    res.attachment('filename.csv');
    res.status(200).send(csv);
});

您可以為CSV轉換器/解析器選擇第三方庫,或者如果它太簡單,則可以創建自己的庫。 以下是創建csv文件的典型方法:

 var data = getData(); var csv = convertCollectionToCsv(data); console.log(csv); function convertCollectionToCsv(docs, seperator) { if (!(Array.isArray(docs) && docs.length > 0)) { return; } seperator = seperator || ','; var header = createHeader(docs); var body = docs.map(convertObjectsToCsv); var csv = [] .concat([header]) .concat(body) .join('\\n'); return csv; function createHeader(docs) { var headRow = docs[0]; var header = Object.keys(headRow); return header.join(seperator); } function convertObjectsToCsv (doc) { // special treatment for dates, nested arrays or objects // for instance: doc['scAttitude'] = (doc['scAttitude'] || []).join('-'); doc['scPosition'] = (doc['scPosition'] || []).join('-'); var values = getValuesFromObject(doc); return values.join(seperator); } } function getValuesFromObject(obj) { if (typeof obj !== 'object' || obj === null) { return []; } var keys = Object.keys(obj); var values = []; for (var i = 0; i < keys.length; ++i) { values.push(obj[keys[i]]); } return values; } function getData() { return [{ "_id": "58405524d70210dc299ca275", "pictureNumber": 1, "scAttitude": [ 0, 0, 0, 1 ], "scPosition": [ 1, 0, 0 ], "integrationTime": 10, "time": "2016-12-01T16:51:57.000Z", "offset": 1, "gain": 2, "ledStatus": false, "imageType": "Image", "cameraType": "Mongo", "testPatternStatus": false, "temperatureCCD": 189, "temperatureLED1": 162, "temperatureLED2": 152, "temperatureVBG": 490, "temperatureGND": 0, "imageValid": true, "remarks": " Reception time: Thu Dec 01 17:51:47 CET 2016", "imageSize": 2271320 }, { "_id": "586bc534b31a89bb45b0083e", "pictureNumber": 2, "scAttitude": [ 1, 0, 0, 1 ], "scPosition": [ 1, 0, 0 ], "integrationTime": 20, "time": "2016-12-02T16:51:57.000Z", "offset": 2, "gain": 0, "ledStatus": false, "imageType": "Image", "cameraType": "MOngo", "testPatternStatus": false, "temperatureCCD": 189, "temperatureLED1": 162, "temperatureLED2": 152, "temperatureVBG": 490, "temperatureGND": 0, "imageValid": true, "remarks": " Reception time: Thu Dec 01 17:51:47 CET 2016", "imageSize": 2271320 }]; } 

暫無
暫無

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

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