目录
前言
在学习完网络编程之后,需要完成一个云字典的小项目,其中的难点在于,如何去查询文件中的单词,或者如何将文件以完美的格式放入数据库的表中
1.使用指令了解
sqlite>.separator "|"
此时是设置为列分隔符为"|"
sqlite> .import 文件名 表名
注1: 不要忘了开头的点
注2: 这条语句不能用分号结束. 非SQL不需要分号结束.
注3: 需要查看默认的分隔符separator. 必须一致. 如果不一致可能导致sqlite字段分割错误.
2.改写文档
我们要加入表中的TXT文档如下:
前半部分为查找用到的单词,后半部分为单词的解释,共计进两万行
我们表中的数据分为两列,一列为单词,一列为单词注释,我们需要找到合适的分隔符来将TXT文档分为两列,理论上使用空格较为简单,但实际上空格过多,不易分列。
所以我们实际上使用的文档并不满足我们需要的条件,我们需要人为手动的对文档进行改写使其满足我们加入到表中的条件。我们需要在单词和注释之间写入一个分隔符并上去多余的空格,此处我使用‘|’来作为分隔符号
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char buf[512] = {};
int asc;
FILE *fp1 = fopen("dict.txt", "r+");
FILE *fp2 = fopen("123.txt", "w");
while (1)
{
while (1)
{
asc = fgetc(fp1);
if (asc == ' ')
{
fseek(fp1, -1, SEEK_CUR);
fputc('|', fp2); //写入分隔符
while (1)
{
asc = fgetc(fp1);
if (asc != ' ')
break; //删去多余空格
}
break;
}
else if (asc == EOF)
break;
fputc(asc, fp2);
}
fseek(fp1, -1, SEEK_CUR); //此处需要向前移动一个位置,否则会吞掉一个字符
while (1)
{
fgets(buf, sizeof(buf), fp1);
fputs(buf, fp2);
if (buf[strlen(buf) - 1] == '\n')
break;
}
if (asc == EOF)
break;
}
fclose(fp1);
fclose(fp2);
remove("dict.txt"); //删除原文件
rename("123.txt", "dict.txt"); //将临时文件名改为原文件名
return 0;
}
当处理完文档后,会变成这样的效果:
此处删去单词与注释之间多余的空格是为了保证单词对比的准确性以及注释的美观性
在文档中如果有“”(双引号)会导致无法正确插入表中,所以我们需要使用VI编辑器的字符串替换指令来将双引号替换为单引号:
:%s/"/'/g
以上就完成了对文档的改写
3.将文档插入到数据库中的表
此时我们可以开始将文档插入数据库中的表了:
(1)先设置分隔符为“|”
因为我们文档中改写的分隔符为“|”,所以我们使用以下指令来进行改写
sqlite>.separator "|"
可以使用“.show”来查看是否改写成功
列分隔符成功被设置为“|”
然后使用“.import 文件名 表名”将文档插入表中:
sqlite> .import dict.txt dictxt
可以使用sqlitebrows图形化界面来查看插入后的效果