使用列表和视图在Cloudant中将JSON数据转换为CSV
我尝试使用List函数将Cloudant db中的JSON数据转换为csv格式。它适用于除JSON数组值(即嵌套值)之外的所有值。对于这些,我在csv文档中将[object]作为输出 请在下面找到我正在使用的示例JSON文档:使用列表和视图在Cloudant中将JSON数据转换为CSV,json,csv,ibm-cloud,cloudant,Json,Csv,Ibm Cloud,Cloudant,我尝试使用List函数将Cloudant db中的JSON数据转换为csv格式。它适用于除JSON数组值(即嵌套值)之外的所有值。对于这些,我在csv文档中将[object]作为输出 请在下面找到我正在使用的示例JSON文档: { "NAME": "Aparna", "EMAIL": "something@domain.com", "PUBLIC_OFFICIALS_CONTACTED": [ { "NAME_PUBLIC_OFFICIAL": [ "ab"
{
"NAME": "Aparna",
"EMAIL": "something@domain.com",
"PUBLIC_OFFICIALS_CONTACTED": [
{ "NAME_PUBLIC_OFFICIAL": [ "ab"],
"TITLE_PUBLIC_OFFICIAL": ["cd"]}
],
"COMMUNICATION_TYPE": [
"Meeting",
"Phone",
"Handout",
"Conference"
],
"NAMES_OF_OTHERS_FROM_IBM": [
{ "NAME_OF_OTHERS": ["ef"],
"TITLE_OF_OTHERS": [ "gh"]}
],
"COMMUNICATION_BENEFIT": "Yes",
"LAST_UPDATE_BY" : "ap"
}
Please find the map and list functions used below :
"map" : "function(doc){
if((\"SAVE_TYPE_SUBMIT\" in doc) && (doc.SAVE_TYPE_SUBMIT== \"Submit\")) {
emit (doc. LAST_UPDATE_BY,[doc.NAME,doc.EMAIL,doc.PUBLIC_OFFICIALS_CONTACTED[0].NAME_PUBLIC_OFFICIAL,\n doc.PUBLIC_OFFICIALS_CONTACTED[0].TITLE_PUBLIC_OFFICIAL,doc.COMMUNICATION_TYPE,doc.NAMES_OF_OTHERS_FROM_IBM[0].NAME_OF_OTHERS, doc.NAMES_OF_OTHERS_FROM_IBM[0].TITLE_OF_OTHERS, doc.COMMUNICATION_BENEFIT,doc. LAST_UPDATE_BY,doc.LAST_UPDATE_DATE]) ;
}
}
"list" : "function (head, req) {
var row;
start({\n headers: {'Content-Type': 'text/csv' },
});
var first = true;
while(row = getRow()) {
var doc = row.doc;
if (first) {
send(Object.keys(doc).join(',') + '\\n');
first = false;\n }
var line = '';
for(var i in doc) {
// comma separator
if (line.length > 0) {
line += ',';\n }
// output the value, ensuring values that themselves
// contain commas are enclosed in double quotes
var val = doc[i];
if (typeof val == 'string' && val.indexOf(',') > -1) {
line += '\"' + val.replace(/\"/g,'\"\"') + '\"';
}
else {
line += val;
}
}
line += '\\n';
send(line);
}}"
注意:在映射中,为了简化函数,现在只从JSON数组中提取了第一个值
请帮助理解如何获取嵌套的JSON值或数组,并以csv格式下载它们。任何指导都将不胜感激 您可以尝试将要导出的对象字符串化,这样您会得到一些线索
if (typeof val == 'string' && val.indexOf(',') > -1) {
line += '\"' + val.replace(/\"/g,'\"\"') + '\"';
}
else {
line += JSON.stringify(val);
}
甚至更好
if (typeof val == 'string' && val.indexOf(',') > -1) {
line += '\"' + val.replace(/\"/g,'\"\"') + '\"';
}
else if(val instanceof Array){
line += val.join(',');
}
else {
line += JSON.stringify(val);
}
这里有一些事情需要改变,这可能会有所帮助。首先,您不需要发出所有要使用的值,因为在处理视图时,您可以从列表中访问文档本身 考虑到这一点,地图可以有一个类似于
emit(doc.LAST\u UPDATE\u BY,null)代码>
有了这个选项,如果您使用include\u docs=true
请求列表/视图,那么您可以在while(row=getRow())
部分中引用文档中的字段,如下所示:
send(row.doc.NAME+,“+row.doc.EMAIL+”\\n')代码>
对于嵌套文档,请尝试以下操作:
row.doc.PUBLIC\u officer\u contact.0.NAME\u PUBLIC\u officer
您已经在另一个问题中提到了我推荐的文章,作为一个完整的工作示例-希望这个解释也有帮助。您的解决方案确实帮助我获得文档中的JSON数组值,因为这是我的问题,所以我选择这个。问题在于,在csv中格式化此值并不容易,因为每个字段都被视为字符串的一部分。不过,谢谢你的回答!这确实有帮助。