编译命令

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. Caffe : Layer Catalogue(1)

    原文:http://caffe.berkeleyvision.org/tutorial/layers.html 参考:http://blog.csdn.net/u011762313/article/d ...

  2. Cracking the coding interview--Q1.1

    原文: Implement an algorithm to determine if a string has all unique characters. What if you can not u ...

  3. 程序错误[C/C++]

    对于初学者而言,一般意义上,程序错误可以分为两类,逻辑错误和非逻辑错误.前者是指,程序可以通过编译或链接但运行时不符合预期结果,后者是程序不能通过编译或链接. 乍一看这样的分类非常清楚.不过,当引入语 ...

  4. 简要介绍如何集成Vitamio安卓版SDK

    1.下载VitamioBundle的最新稳定,这里下载的是最新版4.2.2. 2.解压缩后,导入 Vitamio 库工程(即vitamio)和Demo工程(即vitamio--sample)到 Ecl ...

  5. CH Round #53 -【Nescafé 32】杯NOIP模拟赛

    A.GCD Path http://ch.ezoj.tk/contest/CH%20Round%20%2353%20-%E3%80%90Nescaf%C3%A9%2032%E3%80%91%E6%9D ...

  6. Android 读取手机某个文件夹目录及子文件夹中所有的txt文件

    1. activity_main.xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro ...

  7. MyEclipse第一个Servlet程序 --解决Win7系统下MyEclipse与Tomcat连接问题

    前言 本文旨在帮助学习java web开发的人员,熟悉环境,在Win7系统下运行自己的第一个Servlet程序,因为有时候配置不当或系统原因可能会运行不成功,这给初学者带来了一定烦恼,我也是为此烦恼过 ...

  8. hdu 5422 Rikka with Graph(简单题)

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  9. 再说重写IHttpHandler,实现前后端分离

    aspx页面第一次加载时,HttpHandler 里面是如何编译指定页面的呢?Framework提供了编译页面的API如下: BuildManager.CreateInstanceFromVirtua ...

  10. Sql Server 查看所有存储过程或视图的位置及内容

    and a.object_id = b.object_id and a.[type] in ('P','V','AF') order by a.[name] asc 通过这个sql语句可以查到sql ...