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 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...
随机推荐
- Effective Java Item4:Enforce noninstantiability with a private constructor
Item4:Enforce noninstantiability with a private constructor 通过构造私有化,禁止对象被实例化. public class UtilClass ...
- bzoj4033
http://www.lydsy.com/JudgeOnline/problem.php?id=4033 树形DP. 我们发现,每条边都是一条桥,若我们知道这条边其中一侧有多少个黑点,我们就可以知道这 ...
- bzoj1190
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1190 神题...... F[i][j]表示容量为j*2^i+W第i-1位到第0位的最大价值, ...
- cf437C The Child and Toy
C. The Child and Toy time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Linux下PHP安装配置MongoDB数据库连接扩展
Web服务器: IP地址:192.168.21.127 PHP安装路径:/usr/local/php 实现目的: 安装PHP的MongoDB数据库扩展,通过PHP程序连接MongoDB数据库 具体操作 ...
- JQuery的父、子、兄弟节点查找,节点的子节点循环
Query.parent(expr) //找父元素 jQuery.parents(expr) //找到所有祖先元素,不限于父元素 jQuery.children( ...
- PHP本地域名解析教程
1.找到C:\WINDOWS\system32\drivers\etc\hosts 127.0.0.1 localhost 127.0.0.1 www.zhosoft.com ...
- VMware vSphere 5.5的12个更新亮点(1)
[IT专家网虚拟化]在VMworld 2013大会上发布的VMware vSphere 5.5版本提供的增强和改进,横跨从hypervisor到管理整个堆栈,提升了VMware的性能.可伸缩性和可用性 ...
- [Redux] Extracting Presentational Components -- Footer, FilterLink
Code to be refactored: let nextTodoId = 0; class TodoApp extends Component { render() { const { todo ...
- C++11 多线程 基础
C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等,使用 ...