2022/8/17——使用c语言将文件中的内容导入到数据库中

发布于:2023-01-13 ⋅ 阅读:(555) ⋅ 点赞:(0)

使用的数据库为sqlite3

使用的sqlite3自带的函数为

函数名 功能

sqlite3_open

打开数据库,如果数据库不存在,则创建并打开

sqlite3_errmsg

打印错误码对应的错误信息

sqlite3_errcode

sqlite3_close

sqlite3_exec

指定一条sql语句

其中,使用sqlite3_exec函数完成在c语言代码中运行sqlite语句,从而实现数据的快速导入

函数原型:
int sqlite3_exec(
      sqlite3* db,                               /* An open database */
      const char *sql,                           /* SQL to be evaluated */
      int (*callback)(void*,int,char**,char**),  /* Callback function */
      void *arg,                                 /* 1st argument to callback */
      char **errmsg                              /* Error msg written here */
    );

参数:
    sqlite3* db:打开的数据库;
    char *sql:要被执行的sql语句;
    int (*callback)(void*,int,char**,char**):函数指针,该指针指向返回值为int类型,参数列表为void*,int,char**,char**的函数;
                                            只有在sql语句是查询语句的时候有用,其余时候填NULL;
    void *arg:会被传递给回调函数的第一个参数;
    char **errmsg:该二级指针指向的一级指针会指向错误信息;

基本思路为:一行一行的读取文件内容,利用单词与注释之间的多个空格将两者分割存放在不同的数组中,最后使用sprintf函数拼接成sql语句并使用sqlite3_exec函数存入数据库中。

代码实现:

#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>

//打印错误信息的宏函数
#define ERR_MSG(msg)  do{\
	fprintf(stderr,"__%d__",__LINE__);\
	perror(msg);\
}while(0)

int main(int argc, const char *argv[])
{
	//打开数据库
	sqlite3* db = NULL;
	if(sqlite3_open("./dict.db",&db) != SQLITE_OK)
	{
		printf("err_code:%d\n",sqlite3_errcode(db));
		printf("errmsg:%s\n",sqlite3_errmsg(db));
		fprintf(stderr,"__%d__ sqlite3_open failed\n",__LINE__);
		return -1;
	}
	printf("sqlite3_open success\n");
	
	//创建一个表格
	char* sql = "create table if not exists dir(word char, mean char);" ;
	char* errmsg = NULL;

	if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		fprintf(stderr, "__%d__ sqlite3_exec:%s\n", __LINE__, errmsg);
		return -1;
	}
	printf("create table success\n");
	
	//以只读方式打开原文件
	int fd = open("./dict.txt",O_RDONLY);
	if(fd<0)
	{
		ERR_MSG("open");
		return -1;
	}
	printf("打开成功\n");
	char c = ' ';
	char str[40] = "";       //存放单词
	char buf[128] = "";      //存放中文注释
	char sql_2[256] = "";    //存放命令语句
	ssize_t res;
	int i=0;
	
	//一行一行的读取文件内容并写入数据库中
	while(1)
	{
		bzero(str,sizeof(str));
		bzero(buf,sizeof(buf));
		/*while(c == ' ')
		{
			res=read(fd,&c,1);
			if(res < 0)
			{
				ERR_MSG("read");				
			}
		}*/
		//运行到此处说明已经读取到该行的第一个非空格字符
		//这时可以将读取出的字符赋值到str数组中
		//str[0] = c;
		for(i=0; i<40; i++)
		{
			//依次读取字符
			res=read(fd,&c,1);
			if(res < 0)
			{
				ERR_MSG("read");				
			}
			//连续的两个空格表明单词的读取已经结束
			if((str[i-1] == ' ') && (c == ' '))
			{
				break;
			}
			str[i] = c;
		}
		str[i-1] = 0;
		//剔除空格
		while(c == ' ')
		{
			res=read(fd,&c,1);
			if(res < 0)
			{
				ERR_MSG("read");				
			}
		}
		//运行到此处说明已经读取到该行的单词的解释的第一个字符
		//这时可以将读取出的字符赋值到buf数组中
		buf[0] = c;
		for(i=1; i<128; i++)
		{
			//依次读取字符
			res=read(fd,&c,1);
			if(res < 0)
			{
				ERR_MSG("read");				
			}
			//判断该行字符是否读取完毕
			if((c == '\n') || (res == 0))
			{
				break;
			}
			buf[i] = c;
		}
		if(res == 0)
		{
			printf("数据传输完毕\n");
			break;
		}
		//运行到此处说明单词及其中文解释分别存放在str数组和buf数组中
		//接下来将其拼接到sql数组中便于后续的使用
		sprintf(sql_2, "insert into dir values(\"%s\",\"%s\")",str,buf);
		char* errmsg = NULL;
		//将该行的数据传入数据库中
		if(sqlite3_exec(db, sql_2, NULL, NULL, &errmsg) != SQLITE_OK)
		{
			fprintf(stderr, "__%d__ sqlite3_exec:%s\n", __LINE__, errmsg);
			return -1;
		}

	}

	//关闭数据库
	if(sqlite3_close(db) != SQLITE_OK)
	{
		printf("err_code:%d\n",sqlite3_errcode(db));
		printf("errmsg:%s\n",sqlite3_errmsg(db));
		fprintf(stderr,"__%d__ sqlite3_close failed\n",__LINE__);
		return -1;
	}
	printf("sqlite3_close success\n");

	//关闭文件
	close(fd);
	return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到