我知道这应该很容易,但尽管今天花了几个小时看它,但我就是不知道如何去做。据我所知,网上似乎没有简单的示例或教程。
我在 CouchDB 数据库中有几个文档“表”,每个“表”在文档的“架构”字段中都有不同的值。具有相同架构的所有文档都包含一组相同的字段。我想要做的就是能够以 CSV 格式查看不同的“表”,并且我不想在每个架构中指定字段名称列表。
CSV 输出将由 R 脚本使用,因此如果可以避免的话,我不希望输出中出现任何其他 header ;只是字段名称列表,以逗号分隔,值采用 CSV 格式。
例如,“table1”格式的两条记录可能如下所示:
{
"schema": "table1",
"field1": 17,
"field2": "abc",
...
"fieldN": "abc",
"timestamp": "2012-03-30T18:00:00Z"
}
和
{
"schema": "table1",
"field1": 193,
"field2": "xyz",
...
"fieldN": "ijk",
"timestamp": "2012-03-30T19:01:00Z"
}
我的观点很简单:
"all": "function(doc) {
if (doc.schema == "table1") {
emit(doc.timestamp, doc)
}
}"
因为我想按时间戳顺序对记录进行排序。
大概列表函数将类似于:
"csv": "function(head, req) {
var row;
...
// Something here to iterate through the list of fieldnames and print them
// comma separated
for (row in getRow) {
// Something here to iterate through each row and print the field values
// comma separated
}
}"
但我就是无法理解剩下的事情。
如果我想要 CSV 输出看起来像
"timestamp", "field1", "field2", ..., "fieldN"
"2012-03-30T18:00:00Z", 17, "abc", ..., "abc"
"2012-03-30T19:01:00Z", 193, "xyz", ..., "ijk"
我的 CouchDB 列表函数应该是什么样子?
提前致谢
最佳答案
适用于给定 map 的列表函数应如下所示:
function(head,req) {
var headers;
start({'headers':{'Content-Type' : 'text/csv; charset=utf-8; header=present'}});
while(r = getRow()) {
if(!headers) {
headers = Object.keys(r.value);
send('"' + headers.join('","') + '"\n');
}
headers.forEach(function(v,i) {
send(String(r.value[v]).replace(/\"/g,'""').replace(/^|$/g,'"'));
(i + 1 < headers.length) ? send(',') : send('\n');
});
}
}
与 Ryan 的建议不同,列表中包含的字段在此函数中不可配置,并且必须写入顺序或包含字段的任何更改。您还必须重写所需的任何引用逻辑。
关于csv - 从 CouchDB 创建 CSV View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9942503/