C语言解析日志,存储数据到伯克利DB
编译命令
gcc -o dbwriter dbwriter.c -ldb
dbwriter.c
#include <assert.h> #include <stdlib.h> #include <stdio.h> #include <db.h> #include <sys/types.h> #define DATABASE "demo.db" /* 功能:解析日志提取数据(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}; //如果用户之前已经访问过了,那么PV等于之前的PV+现在的PV if(findViewInfo(dbp, user, &oldpv) == 1) { sprintf(&newpv,"%d", atoi(pv) + atoi(oldpv)); printf("new new is %s\n", newpv); } else { strcpy(newpv,pv); } //初始化数据 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; //写入DB ret = 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; } } /* 功能:查找是否已经存在浏览信息 */ 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里把数据复制出来,因为data是栈上数据,不能拿出去使用 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); }
分类:
C Language
, UNIX&Linux
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2012-08-16 使用source命令向数据库写入数据中文乱码的解决方案