2017-08-28 64 views
0

我尝试使用List函数将我的Cloudant数据库中的JSON数据转换为csv格式。它适用于除JSON数组值之外的所有值,即嵌套值。对于这些,我得到[object object]作为我的csv文档中的输出。使用列表和视图将JSON数据转换为Cloudant中的CSV

请找我现在用的,下面的示例JSON文件:

{ 
    "NAME": "Aparna", 
    "EMAIL": "[email protected]", 

    "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格式。任何指导将非常感谢!

回答

1

你可以试着字符串化你想出口的对象,你会得到一些线索

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); 
} 
+0

您的解决方案确实能帮助我获取文档中的JSON数组值,因为这是我的问题,所以我选择了这个。问题在于,在csv中格​​式化该值并不容易,因为每个字段都被视为字符串的一部分。不过,谢谢你的回答!它确实有帮助。 – Aparna

0

有几件事情来改变这里可能帮帮我。首先,你不需要发出你想要使用的所有值,因为你可以在处理视图时从列表中访问文档本身。

考虑到这一点,地图上可以像

emit (doc.LAST_UPDATE_BY, null);

的发射具有这地方,如果你要求与include_docs=true列表/视图,那么你可以参考的字段文档里面在while(row = getRow())部分是这样的:

send(row.doc.NAME + ',' + row.doc.EMAIL + '\\n');

而对于嵌套的文件,你可以试试:

row.doc.PUBLIC_OFFICIALS_CONTACTED.0.NAME_PUBLIC_OFFICIAL

你已经在另外一个问题的文章我推荐一个完整的工作示例https://developer.ibm.com/clouddataservices/2015/09/22/export-cloudant-json-as-csv-rss-or-ical/简称 - 希望这解释也有帮助。