最近由于mongodb作为olap需要导出csv,需要某些人做分析,然后用mongo自带的mongoexp命令导出时
发现有谢value里头有“\n”所以导致导出csv的时候出现自动的非法换行。
用shell处理有些繁琐,所以索性用C写个简易的程序导所需的数据。
1.安装mongo-c-driver-0.94.2
在http://docs.mongodb.org/manual/applications/drivers/下载drivers for C
tar -zxvf mongo-c-driver-0.94.2.tar.gz
cd mongo-c-driver-0.94.2
./configure --prefix=/usr/local/mongo-dri
make
make install
2.基础环境
cd /usr/local/mongo-dri
ls
bin include lib share
vi Makefile
cat Makefile
INCLUDE += -I./include/libmongoc-1.0/
INCLUDE += -I./include/libbson-1.0/
LIB += -luuid -lssl
LIB += -L./lib -lmongoc-1.0
OP += -o main
all:
gcc $(INCLUDE) $(LIB) $(OP) main.c -g
3.构建基本C程序测试
# vim main.c
[root@mongoDR new]# cat main.c
#include <stdio.h>
#include <stdlib.h>
#include "mongoc.h"
#include "bson.h"
int main(int argc, char *argv[]) {
mongoc_client_t *client;
mongoc_collection_t *collection;
mongoc_cursor_t *cursor;
bson_error_t error;
const bson_t *doc;
const char *uristr = "mongodb://127.0.0.1/";
const char *collection_name = "cai.test";
char *str;
char *dbname = "cai";
bson_t query;
bson_t query_double;
mongoc_init ();
client = mongoc_client_new (uristr);
if (!client) {
fprintf (stderr, "Failed to parse URI.\n");
return EXIT_FAILURE;
}
bson_init (&query);
bson_init (&query_double);
double a = 3;
double b = 11;
bson_append_double(&query_double,"$gte", -1, a);
bson_append_double(&query_double,"$lt", -1, b);
bson_append_document(&query, "hello", -1, &query_double);
#if 0
bson_append_utf8 (&query, "hello", -1, "world", -1);
#endif
collection = mongoc_client_get_collection(client, dbname, collection_name);
cursor = mongoc_collection_find (collection, MONGOC_QUERY_NONE, 0, 0, 0, &query, NULL, NULL);
while (!mongoc_cursor_error (cursor, &error) && mongoc_cursor_more (cursor)) {
if (mongoc_cursor_next (cursor, &doc)) {
str = bson_as_json(doc, NULL);
fprintf (stdout, "%s\n", str);
bson_free (str);
}
}
if (mongoc_cursor_error (cursor, &error)) {
fprintf (stderr, "Cursor Failure: %s\n", error.message);
return EXIT_FAILURE;
}
bson_destroy (&query);
mongoc_cursor_destroy (cursor);
mongoc_collection_destroy (collection);
mongoc_client_destroy (client);
return EXIT_SUCCESS;
}
4.测试数据和编译
测试数据> show dbs
admin (empty)
cai 0.078GB
local 0.078GB
test (empty)
> db.cai.test.find();
{ "_id" : ObjectId("536b9370cccf064e0df720f1"), "hello" : -1 }
{ "_id" : ObjectId("536b937ecccf064e0df720f2"), "world" : -1 }
{ "_id" : ObjectId("536b9406cccf064e0df720f3"), "wangyl" : -1 }
{ "_id" : ObjectId("536b9412cccf064e0df720f4"), "caiweg" : 10 }
{ "_id" : ObjectId("536b974ecccf064e0df720f5"), "hello" : -1 }
{ "_id" : ObjectId("536b9753cccf064e0df720f6"), "hello" : 3 }
{ "_id" : ObjectId("536b9758cccf064e0df720f7"), "hello" : 6 }
{ "_id" : ObjectId("536b975ccccf064e0df720f8"), "hello" : 10 }
{ "_id" : ObjectId("536b9760cccf064e0df720f9"), "hello" : 8 }
{ "_id" : ObjectId("536ba654cccf064e0df720fa"), "hello" : "a" }
编译程序运行之
pwd
/usr/local/mongo-dri
make
// 此行是输出效果 #gcc -I./include/libmongoc-1.0/ -I./include/libbson-1.0/ -luuid -lssl -L./lib -lmongoc-1.0 -o main main.c -g
./main
# ./main
2014/05/09 00:23:01.0247: [15436]: INFO: cluster: Client initialized in direct mode.
{ "_id" : { "$oid" : "536b9753cccf064e0df720f6" }, "hello" : 3.000000 }
{ "_id" : { "$oid" : "536b9758cccf064e0df720f7" }, "hello" : 6.000000 }
{ "_id" : { "$oid" : "536b975ccccf064e0df720f8" }, "hello" : 10.000000 }
{ "_id" : { "$oid" : "536b9760cccf064e0df720f9" }, "hello" : 8.000000 }
至此,小程序当然还没写完,但是主要说的还是mongo的C驱动程序!
后续还需要将bson数据转换成结构体,然后将值中的“\n”去掉,导出成CSV格式就可以收工了!
############################
本文由笔者原创
作者:john
转载请注明出处