[英]how to convert a CSV into JSON using Python Or Java. The csv is representation of a nested JSON (Containing array of json objects and nested objects)
[英]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.