您的位置:首页 > 数据库

将字典txt文件写入数据库中

2020-03-30 07:48 746 查看

将字典写入数据库中

sqlite3_exec()->cql语句中不在外边创建,则需添加create table if not exists dict (id int,char meaning,… );
插入记录:insert into dict values (…);
若插入过程中出现错误,则可以用delete from dict 清空表
获取dict.txt文件信息,调用函数fgets();按行获取
获取到一行文件包括词和意思 如下图所示,每一行包括序号,单词及单词解释。

获取到一行内容即一个字符串,那么需要对获取到的字符串进行解析,需要定义两个指针,一个指向单词,一个指向单词解释;
然后使用strtok();函数来分割。按空格分隔

解析后放入数据库
添加用insert into dict values (…);
id word mean dt
id:序号自增
dt:datetime(‘now’,’+8 hours’)
sprintf(buf,"insert into dict values (NULL,’%s’,’%s’,datetime(‘now’,’+8 hours’));"word,mean);拼一个字符串

对于o’clock类似单词会用到转义字符"%s"
此处使用转义字符可以将字符串替换后的字符里面的 ( ’ ) 屏蔽掉,不会造成不配对。

题目: 将一个进20000行的dict.txt文件写入数据库中,每行会有单词和解释,需要用到字符串分割的方法,要注意,文本中每行的结尾为
od -c dict.txt|less 查看文件所有字符,按一个格子一个格子显示,得到每一行的结束都为 \r\n

代码

#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, const char *argv[])
{
sqlite3 *db;
//打开数据库,成功返回0,失败返回错误码
int ret = sqlite3_open("/home/linux/test.db",&db);

if(SQLITE_OK != ret)
{
fprintf(stderr,"fail to open db %s\n",sqlite3_errmsg(db));
}

//打开文件
FILE *fd = fopen("/home/linux/dict.txt","r");

//文件打开失败
if(NULL == fd)
{
perror("fail to open");
exit(1);
}

//创建表
char sql_cmd[1024] = "create table if not exists dict (id int,word char,means char,dt datetime);";
char *errmsg;
int ret1 = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);
if(SQLITE_OK != ret1)
{
fprintf(stderr,"sql_cmd create table error:%s\n",errmsg);
sqlite3_free(errmsg);
exit(1);
}
//删除表
//错误示例:sql_cmd = "delete from dict";
bzero(sql_cmd,1024);
strcpy(sql_cmd,"delete from dict");
int ret2 = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);
if(SQLITE_OK != ret2)
{
fprintf(stderr,"sql_cmd error %s\n",errmsg);
sqlite3_free(errmsg);
exit(1);
}
//存放文件属性
struct stat st;
ret = stat("/home/linux/dict.txt",&st);
if(ret == -1)
{
perror("stat error\n");
return 1;
}
//当前处理大小
unsigned long current_size = 0;

int i = 1;
while(1)
{
//定义一个数组存放获取信息
char buf[1024] = {0};
char *ret = fgets(buf,1024,fd);//获取文件的一行

//文件退出条件
if(NULL == ret)
{
break;
}
current_size += strlen(buf);

char *word = strtok(buf," ");//strtok函数,以空格为分割界限进行分割
//方法1
char *means = strtok(NULL,"\r");
/*方法2:
char *means = strtok(NULL,"\n");
mean[strlen(mean)-1] = '\0';
*/
char sql_cmd[1024];

while(*means == ' ')
{
++means;
}
//插入记录

sprintf(sql_cmd,"insert into dict values (%d,\"%s\",\"%s\",datetime('now','+8 hours'));",i++,word,means);//数据库命令

int ret1 = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);//执行上述命令
if(SQLITE_OK != ret1)
{
fprintf(stderr,"sql_cmd error:%s\n",errmsg);//显示出错码
sqlite3_free(errmsg);
return 1;
}

printf("当前进度:%lu,%lu",current_size,st.st_size);
fflush(stdout);
}
sqlite3_close(db);//关闭数据库
close(fd);//关闭文件
return 0;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
卡卡and源源 发布了15 篇原创文章 · 获赞 1 · 访问量 178 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: