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 = ;
while(*s)
{
if(*s==' ')
{
if(flag==)
{
s++;
flag++;
continue;
}
else
{
*s='\0';
*pv = s+;
return;
}
}
s++;
}
} /*
功能:打开伯克利DB的连接
*/
DB *openDb()
{
int ret;
DB *dbp = NULL; ret = db_create(&dbp, NULL, );
if(ret != )
{
exit();
} ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE,); if(ret != )
{
exit();
} return dbp;
} /*
功能:存储用户的浏览信息
*/
int saveViewInfo(DB *dbp, char *user, char *pv)
{
int ret;
DBT key , data;
char oldpv[] = {};
char newpv[] = {}; //如果用户之前已经访问过了,那么PV等于之前的PV+现在的PV
if(findViewInfo(dbp, user, &oldpv) == )
{
sprintf(&newpv,"%d", atoi(pv) + atoi(oldpv));
printf("new new is %s\n", newpv);
}
else
{
strcpy(newpv,pv);
} //初始化数据
memset(&key, , sizeof(key));
memset(&data, , sizeof(data)); key.data = user;
key.size = strlen(user) + ; data.data = newpv;
data.size = strlen(newpv) + ; //写入DB
ret = dbp->put(dbp, NULL, &key, &data, ); if(ret == )
{
printf("db: %s key stored. value is %s\n", (char*)key.data, (char*)data.data);
return ;
}
else
{
//dbp->err(dbp, ret "DB->put");
fprintf(stderr,"save Db error!\n");
return ;
} } /*
功能:查找是否已经存在浏览信息
*/
int findViewInfo(DB *dbp, char *user, char *pv)
{
int ret;
DBT key, data; memset(&key, , sizeof(key));
memset(&data, , sizeof(data)); key.data = user;
key.size = strlen(user) + ;
printf("get : %s , it %d \n", key.data, key.size); ret = dbp->get(dbp, NULL, &key, &data, ); if(ret == )
{
//从data里把数据复制出来,因为data是栈上数据,不能拿出去使用
strncpy(pv,data.data,data.size);
printf("get : key is %s : data is %s \n" , (char*)key.data, (char*) data.data);
return ;
}
else
{
fprintf(stderr,"read Db error!\n");
return ;
}
} int main (int argc, char **argv)
{
DB *dbp = NULL;
FILE *fp = NULL;
char buffer[ * ]; dbp = openDb();
fp = fopen("20130815.ul","r");
assert(fp != NULL); while(fgets((char*)buffer, *,fp)!=NULL)
{
char *user;
char *pv;
char newpv[] = {}; user = (char*)buffer;
parseLog(buffer,&pv);
saveViewInfo(dbp, user, pv);
findViewInfo(dbp,user,&newpv);
printf("now pv is %s\n", newpv);
memset(&buffer, , * );
} dbp->close(dbp, );
}
C语言解析日志,存储数据到伯克利DB的更多相关文章
- C语言解析日志,存储数据到伯克利DB 2
#编译程序 gcc -o historydb historydb.c -ldb #将2013年8月9日的用户记录写入数据库 (程序自动识别新用户入库,跳过老用户) ./historydb -f .us ...
- C语言解析json类型数据
转自:http://buluzhai.iteye.com/blog/845404 首先感谢作者!! 我使用的是cJSON:http://sourceforge.net/projects/cjson ...
- android开发中的5种存储数据方式
数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...
- [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据
Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...
- scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium
今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...
- Fresco源码解析 - DataSource怎样存储数据
Fresco源码解析 - DataSource怎样存储数据 datasource是一个独立的 package,与FB导入的guava包都在同一个工程内 - fbcore. datasource的类关系 ...
- C语言读写伯克利DB 4
因为缓存数据的buffer总是不够大(会引起段错误)索性从堆上拿了两块大内存 /* 功能说明:逐日存储来访用户(使用伯克利DB) 根据存储的用户信息确定某用户是否是首次来访用户(未被存储的伯克利DB) ...
- C语言解析WAV音频文件
C语言解析WAV音频文件 代码地址: Github : https://github.com/CasterWx/c-wave-master 目录 前言 了解WAV音频文件 什么是二进制文件 WAV的二 ...
- SQL Server 深入解析索引存储(下)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
随机推荐
- Lintcode--004(最小子串覆盖)
给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串. 注意事项 如果在source中没有这样的子串,返回"",如果有多个 ...
- linux下如何编译python生成libpython2.5.so动态库
http://biancheng.dnbcw.info/python/245306.html
- LeetCode_Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- 【转】Java如何克隆集合——深度拷贝ArrayList和HashSet
原文网址:http://blog.csdn.net/cool_sti/article/details/21658521 原英文链接:http://javarevisited.blogspot.hk/2 ...
- poj1014:母函数+优化
题目大意: 有1~6六种宝石,价格分别为1~6 ..给定每种宝石的个数,问能否平分给两个人 分析: 一看显然是个多重背包问题,也可以用母函数做 不过母函数的复杂度是n*v*k,第一次tle了.. 后来 ...
- js设计模式系列之(一)请节约你的请求-代理模式
What’s the proxy pattern? 代理模式其实就是将违反单一性原则的类给抽离出来,尽量满足开放和封闭的原则. 相当于一个类的行为只是一种,但是你可以给这个类添加额外的行为.比如: 一 ...
- js 获取input file路径改变图像地址
html代码 <img id="newImage" alt="100x100" src="__PUBLIC__/img/1.jpg" ...
- js面向对象的五种写法
第一种: //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circle.prototype.area = functio ...
- [IOI1999]花店橱窗布置(DP路径记录)
题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...
- View事件传递之父View和子View之间的那点事
Android事件传递流程在网上可以找到很多资料,FrameWork层输入事件和消费事件,可以参考: Touch事件派发过程详解 这篇blog阐述了底层是如何处理屏幕输,并往上传递的.Touch事件传 ...