C语言解析日志,存储数据到伯克利DB
生活随笔
收集整理的這篇文章主要介紹了
C语言解析日志,存储数据到伯克利DB
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
編譯命令
gcc -o dbwriter dbwriter.c -ldbdbwriter.c
#include <assert.h> #include <stdlib.h> #include <stdio.h> #include <db.h> #include <sys/types.h>#define DATABASE "demo.db"/*功能:解析日志提取數(shù)據(jù)(pv) 日志格式:pp.cn guest:123456 100 */ int parseLog(char *s,char **pv) {int flag = 0;while(*s){if(*s==' '){if(flag==0){s++;flag++;continue;}else{*s='\0';*pv = s+1;return;}}s++;} }/* 功能:打開伯克利DB的連接 */ DB *openDb() {int ret;DB *dbp = NULL;ret = db_create(&dbp, NULL, 0);if(ret != 0){exit(1);}ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE,0664);if(ret != 0){exit(1);}return dbp; }/* 功能:存儲用戶的瀏覽信息 */ int saveViewInfo(DB *dbp, char *user, char *pv) {int ret;DBT key , data;char oldpv[100] = {0};char newpv[100] = {0};//如果用戶之前已經(jīng)訪問過了,那么PV等于之前的PV+現(xiàn)在的PVif(findViewInfo(dbp, user, &oldpv) == 1){sprintf(&newpv,"%d", atoi(pv) + atoi(oldpv));printf("new new is %s\n", newpv);}else{strcpy(newpv,pv);}//初始化數(shù)據(jù)memset(&key, 0, sizeof(key));memset(&data, 0, sizeof(data));key.data = user;key.size = strlen(user) + 1;data.data = newpv;data.size = strlen(newpv) + 1;//寫入DBret = dbp->put(dbp, NULL, &key, &data, 0);if(ret == 0){printf("db: %s key stored. value is %s\n", (char*)key.data, (char*)data.data);return 1;}else{//dbp->err(dbp, ret "DB->put");fprintf(stderr,"save Db error!\n");return 0;}}/* 功能:查找是否已經(jīng)存在瀏覽信息 */ int findViewInfo(DB *dbp, char *user, char *pv) {int ret;DBT key, data;memset(&key, 0, sizeof(key));memset(&data, 0, sizeof(data));key.data = user;key.size = strlen(user) + 1;printf("get : %s , it %d \n", key.data, key.size);ret = dbp->get(dbp, NULL, &key, &data, 0);if(ret == 0){//從data里把數(shù)據(jù)復(fù)制出來,因為data是棧上數(shù)據(jù),不能拿出去使用 strncpy(pv,data.data,data.size);printf("get : key is %s : data is %s \n" , (char*)key.data, (char*) data.data);return 1;}else{fprintf(stderr,"read Db error!\n");return 0;} }int main (int argc, char **argv) {DB *dbp = NULL;FILE *fp = NULL;char buffer[1024 * 4];dbp = openDb();fp = fopen("20130815.ul","r");assert(fp != NULL); while(fgets((char*)buffer, 1024*4,fp)!=NULL) { char *user; char *pv;char newpv[100] = {0};user = (char*)buffer; parseLog(buffer,&pv);saveViewInfo(dbp, user, pv);findViewInfo(dbp,user,&newpv);printf("now pv is %s\n", newpv);memset(&buffer, 0, 1024 * 4);} dbp->close(dbp, 0); }?
轉(zhuǎn)載于:https://www.cnblogs.com/code-style/p/3262706.html
總結(jié)
以上是生活随笔為你收集整理的C语言解析日志,存储数据到伯克利DB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信Android终端SDK新手使用指南
- 下一篇: 程序员浮躁,谁之过错?