编译命令

  1. gcc -o dbwriter dbwriter.c -ldb

dbwriter.c

  1. #include <assert.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <db.h>
  5. #include <sys/types.h>
  6.  
  7. #define DATABASE "demo.db"
  8.  
  9. /*
  10. 功能:解析日志提取数据(pv)
  11. 日志格式:pp.cn guest:123456 100
  12. */
  13. int parseLog(char *s,char **pv)
  14. {
  15. int flag = ;
  16. while(*s)
  17. {
  18. if(*s==' ')
  19. {
  20. if(flag==)
  21. {
  22. s++;
  23. flag++;
  24. continue;
  25. }
  26. else
  27. {
  28. *s='\0';
  29. *pv = s+;
  30. return;
  31. }
  32. }
  33. s++;
  34. }
  35. }
  36.  
  37. /*
  38. 功能:打开伯克利DB的连接
  39. */
  40. DB *openDb()
  41. {
  42. int ret;
  43. DB *dbp = NULL;
  44.  
  45. ret = db_create(&dbp, NULL, );
  46. if(ret != )
  47. {
  48. exit();
  49. }
  50.  
  51. ret = dbp->open(dbp, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE,);
  52.  
  53. if(ret != )
  54. {
  55. exit();
  56. }
  57.  
  58. return dbp;
  59. }
  60.  
  61. /*
  62. 功能:存储用户的浏览信息
  63. */
  64. int saveViewInfo(DB *dbp, char *user, char *pv)
  65. {
  66. int ret;
  67. DBT key , data;
  68. char oldpv[] = {};
  69. char newpv[] = {};
  70.  
  71. //如果用户之前已经访问过了,那么PV等于之前的PV+现在的PV
  72. if(findViewInfo(dbp, user, &oldpv) == )
  73. {
  74. sprintf(&newpv,"%d", atoi(pv) + atoi(oldpv));
  75. printf("new new is %s\n", newpv);
  76. }
  77. else
  78. {
  79. strcpy(newpv,pv);
  80. }
  81.  
  82. //初始化数据
  83. memset(&key, , sizeof(key));
  84. memset(&data, , sizeof(data));
  85.  
  86. key.data = user;
  87. key.size = strlen(user) + ;
  88.  
  89. data.data = newpv;
  90. data.size = strlen(newpv) + ;
  91.  
  92. //写入DB
  93. ret = dbp->put(dbp, NULL, &key, &data, );
  94.  
  95. if(ret == )
  96. {
  97. printf("db: %s key stored. value is %s\n", (char*)key.data, (char*)data.data);
  98. return ;
  99. }
  100. else
  101. {
  102. //dbp->err(dbp, ret "DB->put");
  103. fprintf(stderr,"save Db error!\n");
  104. return ;
  105. }
  106.  
  107. }
  108.  
  109. /*
  110. 功能:查找是否已经存在浏览信息
  111. */
  112. int findViewInfo(DB *dbp, char *user, char *pv)
  113. {
  114. int ret;
  115. DBT key, data;
  116.  
  117. memset(&key, , sizeof(key));
  118. memset(&data, , sizeof(data));
  119.  
  120. key.data = user;
  121. key.size = strlen(user) + ;
  122. printf("get : %s , it %d \n", key.data, key.size);
  123.  
  124. ret = dbp->get(dbp, NULL, &key, &data, );
  125.  
  126. if(ret == )
  127. {
  128. //从data里把数据复制出来,因为data是栈上数据,不能拿出去使用
  129. strncpy(pv,data.data,data.size);
  130. printf("get : key is %s : data is %s \n" , (char*)key.data, (char*) data.data);
  131. return ;
  132. }
  133. else
  134. {
  135. fprintf(stderr,"read Db error!\n");
  136. return ;
  137. }
  138. }
  139.  
  140. int main (int argc, char **argv)
  141. {
  142. DB *dbp = NULL;
  143. FILE *fp = NULL;
  144. char buffer[ * ];
  145.  
  146. dbp = openDb();
  147. fp = fopen("20130815.ul","r");
  148. assert(fp != NULL);
  149.  
  150. while(fgets((char*)buffer, *,fp)!=NULL)
  151. {
  152. char *user;
  153. char *pv;
  154. char newpv[] = {};
  155.  
  156. user = (char*)buffer;
  157. parseLog(buffer,&pv);
  158. saveViewInfo(dbp, user, pv);
  159. findViewInfo(dbp,user,&newpv);
  160. printf("now pv is %s\n", newpv);
  161. memset(&buffer, , * );
  162. }
  163.  
  164. dbp->close(dbp, );
  165. }

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. 创建一个自己的动态HTML-备

    -.获取元素 改变属性 通过id来获取HTML元素 通过标签名找到HTML元素 通过类名来找到HTML元素 举个

  2. 同时处理html+js+jquery+css的插件安装(Spket&Aptana插件安装)

    Spket 在线安装方法:Help->Software Updates(或者Install New Software)->Add site Location:http://www.spke ...

  3. [工具]web开发时自动刷新网页:liveReload

    传统网页开发流程:用sublime text写好代码,运行,发现问题,再回到sublime text修改,运行…如此往复,十分繁琐.今天看到有人(<LiveReload>讓Sublime ...

  4. poj2068--Nim

    题意:给你2n个人,两方各n个人,交叉坐,每个人可以取的石子有一个最大限制,总共有S颗石子,哪一方取了最后一颗石子就输了,问先取石子的这一方是否有必胜策略. DP,dp[i][j]代表第i个人还有J个 ...

  5. PowerShell文件系统(一)前言

    PowerShell文件系统(一)前言 3 12 2月, 2014  在 Powershell tagged Powershell教程 / 别名 / 文件系统 by Mooser Lee PowerS ...

  6. maven compile时出现“非法字符: \65279”的解决

    我碰到的这个问题是因为Java文件编码为UTF-8 BOM格式导致:解决这个可以使用UltraEdit. 用UltraEdit打开出问题的Java文件,将文件另存为,在保存对话框的编码中选择UTF-8 ...

  7. 在 Java 应用程序中使用 Elasticsearch

    如果您使用过 Apache Lucene 或 Apache Solr,就会知道它们的使用体验非常有趣.尤其在您需要扩展基于 Lucene 或 Solr 的解决方案时,您就会了解 Elasticsear ...

  8. hdu 2254 奥运

    点击打开hdu 2254 思路: 矩阵乘法 分析: 1 题目给定一个有向图,要求t1-t2天内v1-v2的路径的个数 2 根据离散数学里面的可达矩阵的性质,我们知道一个有向图的邻接矩阵的前n次幂的和即 ...

  9. Spring MVC + Spring MongoDB + Querydsl 通过maven整合实例

    效果图 一共3个页面:注册页,欢迎页,用户列表页 很简单的例子,主要是为了把流程走通,没有各种验证. 注册页: 欢迎页: 用户列表页: 源码地址 https://github.com/lemonbar ...

  10. 前端开发利器—FIDDLER 转

    http://www.cnblogs.com/yuzhongwusan/archive/2012/07/20/2601306.html 前端开发利器—FIDDLER 1.Fiddler相对其他调试工具 ...