在我的node.js应用程序中,我从mongodb服务器检索值,并希望将它们转换为CSV文件。可以从数据库轻松访问父元素并显示在CSV文件中,但子元素不会显示,并且可以'被访问..
JSON结构:
"name" : "fhj",
"age" : "23",
"gender" : "female",
"sec" : "b",
"username" : "9886666",
"language" : "HINDI",
"method" : "method2",
"timeSlot" : {
"id" : 2,
"fromTime" : 12,
"toTime" : 15
}
mycode的:
db.users.find(function(err,values){
if(err||!values.length)
console.log("ERROR !!!!");
else
{
var i=1;
str='[';
values.forEach(function(user){
if(i==values.length)
str=str+'{ "name" : "' + user.username + '","age" : "'+ user.age +'","gender":"'+user.gender+'","sec":"'+user.sec+'","username":"'+user.username+'","language":"'+user.language+'","method":"'+user.method+'","Timeslot":"'+user.timeslot+'"}';
else{
str = str + '{ "name" : "' + user.username + '","age" : "'+ user.age +'","gender":"'+user.gender+'","sec":"'+user.sec+'","username":"'+user.username+'","language":"'+user.language+'","method":"'+user.method+'","Timeslot":"'+user.timeslot+'"},' +'\n';
i++;
}
});
str = str.trim();
str = str + ']';
var obj=JSON.parse(str);
json2csv({data: obj, fields: ['name', 'age','gender','sec','username','language','method','Timeslot']}, function(err, csv) {
if (err)
console.log(err);
fs.writeFile('./files/user.csv', csv, function(err) {
if (err)
throw err;
console.log('File saved');
});
});
}
});
除了时间段的子元素外,显示所有值。 如何从数据库访问JSON的子元素并显示CSV文件中的所有值???
答案 0 :(得分:2)
可以在following thread(访问嵌套数据结构)的答案中找到访问嵌套元素的简便方法。
嵌套数据结构是引用其他数组或对象的数组或对象,即其值是数组或对象。可以通过连续应用点或括号表示来访问这种结构。
我们可以看到timeSlot是一个对象,因此我们可以使用点表示法访问它的属性。可以按如下方式访问items属性:
timeSlot.id
或者,我们可以对任何属性使用括号表示法,特别是如果名称包含的字符会使点符号用法无效:
var item_name = timeSlot['id'];
获得所需的所有数据后,CSV文件的创建应该非常简单:)
答案 1 :(得分:1)
尝试以下
db.users.find(function(err, users){
if (err || !users.length)
return console.log(err || 'Users not found');
// List of column to export to cvs
var columns = ['name', 'age', 'gender', 'sec', 'username', 'language', 'method', 'timeSlot'];
var text = users.reduce(function(text, user){
// user is object e.g. {name : "fhj", age : "23", .. }
// If user is json then `user = JSON.parse(user, columns);`
// convert user to csv-line
text += columns.reduce(function(line, col){
// I'm don't know how timeSlot must be save => save as json
line += (type user[col] == 'object') ? JSON.stringify(user[col], ['id', 'fromTime', 'toTime']) : user[col];
line += ';';
return line;
}, '') + '\n';
return text;
}, '');
fs.writeFile('./files/user.csv', text, function(err) {
if (err)
throw err;
console.log('File saved');
});
});
答案 2 :(得分:0)
尝试使用user.timeslot.fromTime&&为每个子元素创建一个键/值
答案 3 :(得分:0)
试试这样。这会将timeSlot对象中的所有数据合并为单个字符串。您可以根据需要格式化该字符串。代码添加forEach循环。
var strToAdd = "";
for (var k in timeSlot) {
strToAdd += k + timeSlot[k] + "->";
}
...+"Timeslot":"'+strToAdd+'"....
希望这有帮助。
答案 4 :(得分:0)
似乎问题在于,在您正在迭代变量values
的forEach循环中,您正在访问timeslot
的属性user
,而不是值timeSlot
user
。记住区分大小写很重要!
在链接的示例中,我也在对该对象进行字符串化,以便我可以将其写入文档并清楚地看到输出。我建议不要这样做,因为你可能会遇到稍后解析它的问题。相反,您应该通过访问该对象的属性来构造一个字符串。
无论如何,您遇到错误的原因是原始代码中的区分大小写问题。我希望这有帮助。
答案 5 :(得分:0)
当您阅读结构化数据(此处为:JSON)并希望将其转换为展平数据(此处为:csv)时,您必须决定如何执行展平。
换句话说 - 您的csv目标结构可能如下:
name, age, gender, sec, username, language, method, timeSlot_id, timeSlot_fromTime, timeSlot_toTime
"fhb","23","female","b","9886666","HINDI","method2",2,12,15
一旦你决定用这种方式展平 timeSlot 中给出的结构,你就可以使用@Aikon Mokwai中没有stringify的备注 - 使用@trolologuy所描述的数组表示法阅读结构:
var timeSlot_id = timeSlot['id]';
var timeSlot_fromTime = timeSlot['fromTime'];
var timeSlot_toTime = timeSlot['toTime'];
随后,无论是谁读取csv都必须明白你弄平了数据,但不必解析任何结构,因为你真的提供了平坦的数据记录(正如csv最喜欢的那样)。
希望它有所帮助!
答案 6 :(得分:0)
您可以使用异步foreach循环来实现上述功能。以下是它的工作原理。
答案 7 :(得分:0)
var json= {
"name" : "fhj",
"age" : "23",
"gender" : "female",
"sec" : "b",
"username" : "9886666",
"language" : "HINDI",
"method" : "method2",
"timeSlot" : {
"id" : 2,
"fromTime" : 12,
"toTime" : 15
}
};
console.log(json.timeSlot['id']);
console.log(json.timeSlot['fromTime']);
console.log(json.timeSlot['toTime']);
享受:)
请参阅jsfiddle