编译命令

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的更多相关文章

  1. C语言解析日志,存储数据到伯克利DB 2

    #编译程序 gcc -o historydb historydb.c -ldb #将2013年8月9日的用户记录写入数据库 (程序自动识别新用户入库,跳过老用户) ./historydb -f .us ...

  2. C语言解析json类型数据

    转自:http://buluzhai.iteye.com/blog/845404   首先感谢作者!! 我使用的是cJSON:http://sourceforge.net/projects/cjson ...

  3. android开发中的5种存储数据方式

    数据存储在开发中是使用最频繁的,根据不同的情况选择不同的存储数据方式对于提高开发效率很有帮助.下面笔者在主要介绍Android平台中实现数据存储的5种方式. 1.使用SharedPreferences ...

  4. [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据

    Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...

  5. scrapy架构与目录介绍、scrapy解析数据、配置相关、全站爬取cnblogs数据、存储数据、爬虫中间件、加代理、加header、集成selenium

    今日内容概要 scrapy架构和目录介绍 scrapy解析数据 setting中相关配置 全站爬取cnblgos文章 存储数据 爬虫中间件和下载中间件 加代理,加header,集成selenium 内 ...

  6. Fresco源码解析 - DataSource怎样存储数据

    Fresco源码解析 - DataSource怎样存储数据 datasource是一个独立的 package,与FB导入的guava包都在同一个工程内 - fbcore. datasource的类关系 ...

  7. C语言读写伯克利DB 4

    因为缓存数据的buffer总是不够大(会引起段错误)索性从堆上拿了两块大内存 /* 功能说明:逐日存储来访用户(使用伯克利DB) 根据存储的用户信息确定某用户是否是首次来访用户(未被存储的伯克利DB) ...

  8. C语言解析WAV音频文件

    C语言解析WAV音频文件 代码地址: Github : https://github.com/CasterWx/c-wave-master 目录 前言 了解WAV音频文件 什么是二进制文件 WAV的二 ...

  9. SQL Server 深入解析索引存储(下)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

随机推荐

  1. cf B. Two Heaps

    http://codeforces.com/contest/353/problem/B 题意:要把2*n个两位数分成两部分,使得第一部分上的数和第二部分上的两位数组成四位数.求怎么分能使构成的不同的四 ...

  2. cf B. Eight Point Sets

    http://codeforces.com/contest/334/problem/B #include <cstdio> #include <cstring> #includ ...

  3. Powershell Switch 条件

    Powershell Switch 条件 6 21 1月, 2012  在 Powershell tagged Powershell教程/ 分支/ 字符串/ 数字/ 条件by Mooser Lee 本 ...

  4. logstash 各种时间转换

    <pre name="code" class="html">日期格式转换: /***** nginx 访问日志 [elk@zjtest7-front ...

  5. 【剑指offer】面试题37:两个链表的第一个公共结点

    题目: 输入两个链表,找出它们的第一个公共结点. 思路: 由链表的定义知是单链表.对于单链表,如果两个链表有公共结点,则两个链表必然是像Y型相交.则先计算出各个链表的长度,让长链表的头指针先走多出来的 ...

  6. c指针点滴1

    #include <stdio.h> #include <stdlib.h> void main() { ; int *p = &num;//&num是一个地址 ...

  7. hdu 5072 Coprime (容斥)

    Problem Description There are n people standing in a line. Each of them has a unique id number. Now ...

  8. python数据类型-布尔值

    布尔是计算机里最基本的判断单位,布尔只有两个值:真或假,即True False,也就是1或0. 在以后学习流程控制时会经常用到布尔值. 先来看简单的小例子: >>> 1+1 > ...

  9. [iOS]数据库第三方框架FMDB详细讲解

    [iOS]数据库第三方框架FMDB详细讲解 初识FMDB iOS中原生的SQLite API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦.于是,就出现了一系列将SQLite API进行封 ...

  10. (转)Android中截取当前屏幕图片

    该篇文章是说明在Android手机或平板电脑中如何实现截取当前屏幕的功能,并把截取的屏幕保存到SDCard中的某个目录文件夹下面.实现的代码如下: /** * 获取和保存当前屏幕的截图 */ priv ...