数据转存小任务总结

本文介绍了作者在完成一个数据转存任务的过程中,使用SQLite数据库进行数据导入的经验。首先,将TXT文本转换为Unicode格式,然后通过C语言编写程序,提取数据并构造SQL插入语句。接着,将Unicode文本转换为ANSI格式,通过SQLite执行批量添加记录。文章还讨论了在VC环境下使用SQLite的注意事项,包括字符串特殊字符处理、事务使用以及性能优化,如使用索引来提高查询速度。
摘要由CSDN通过智能技术生成

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} /* List Definitions */ @list l0 {mso-list-id:508521334; mso-list-type:hybrid; mso-list-template-ids:2065610682 1390705918 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1 {mso-level-tab-stop:18.0pt; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} @list l1 {mso-list-id:1840852170; mso-list-type:hybrid; mso-list-template-ids:-1922774150 586981916 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l1:level1 {mso-level-tab-stop:18.0pt; mso-level-number-position:left; margin-left:18.0pt; text-indent:-18.0pt;} ol {margin-bottom:0cm;} ul {margin-bottom:0cm;} -->

师兄给了个小任务,用 sqlite 建个数据库文件,里面建立一张表 (DictCnToEn) ,属性项为: ID,Cn,En,Symbol 。将一个有相关数据的 txt 文本导入其中。用 C 写完这个东西,感觉学到了不少东西,主要是字符编码,还有数据库操作的知识。

 

之前对编码和数据库的编程不熟悉,过程有点曲折,但最后做出来的步骤很简单:

1.       txt 文本转成 Unicode 格式,从文件读入文本内容。

2.       提取出感兴趣的内容,并做成数据库命令的格式,输出到文本,还是 Unicode 格式。

3.       将文本文件的编码转化成 ANSI 格式后,操作数据库从文件读入命令来添加记录。

4.       优化和完善。

 

具体过程是这样的:

1.       先将文本转成 Unicode 格式,因为 Unicode 编码方式中每个字符都是两个字节。

C/C++ 中定义双字节字符 ( 也可称宽字符 ) 可以使用 wchar_t, wchar_t 原型是 unsigned short 型的整数,占两个字节。使用宽字符串常量需要加大写 L ,例如 wchar_t s[] = L” 中文是 chinese”; s[] 的大小就是 11 个宽字符 *sizeof(wchar_t), 22 个字节,其中字符串结尾的标记也是两个字节,即 0x0000

对于宽字符串,使用的库函数也相应地改变了,比如单字节字符串操作 strcpy strlen strstr 变成了 wcscpy wcslen wcswcs 。同样,文件输入输出函数, fgetc, fgets, fputc, fputs ,相应变成了 fgetwc, fgetws, fputwc, fputws 等,但是参数的类型除 char 变成 wchar_t 外,其他都没有变化。

 

2.       提取感兴趣的内容,主要用到 wcswcs() 函数查找作为标记的子串,通过简单的方法,将需要的内容提取出来。输出到文件中的格式为数据库查询命令的格式。比如在一行中提取到一组 (“ 中文 ”, “chinese”, “sn2ji”) ,那么就做成形如 insert into DictCnToEn values(NULL, ' 中文 ', 'chinese', 'sn2ji') 的格式保存到文件,每一组对应一条 insert 语句。这样一来,就能通过文件方便地添加记录至 sqlite.

转换格式的代码:


 

添加记录至数据库的代码:

   


3.       如何在 VC 下使用 sqlite 数据库参见另两篇文章: VC 环境编译使用 sqlite 数据库全过程 [zz] sqlite3 使用总结 [zz]

另外,发现只能将 ANSI 格式的字符串作为查询命令传递给 sqlite3_exec(); 所以还要先将刚刚得到的保存 sql 语句的 Unicode 文件转化成 ANSI 格式。

 

数据库的操作中遇到的三个问题。

第一个问题是得到了形如 insert into DictCnToEn values(NULL, ' 我是 ', 'I’m', ''), “I’m” 中的 和字符串前后的 相冲突了 ( 数据库会把 I’m 中的 当成当前字符串的结束 ) ,这个时候有两种解决方法:一是字符串的标记改成双引号 insert into DictCnToEn values(NULL, “ 我是 ”, “I’m”,””) ;二是在字符串中的 前再加一个 ,如 insert into DictCnToEn values(NULL, ' 我是 ', 'I’’m', '')

遇到的第二个问题是,在使用文件中的 insert 语句添加数据到数据库中的时候, 10 条添加语句就用了 60s, 这样算下来 40+W 条记录,要等个几小时才能存完。在师兄的提醒下,使用了事务。见 sqite3 使用事务处理 [zz]

遇到的第三个问题是成功使用数据创建数据表以后,查询速度的问题。三十个查询用了 8s 的时间。这是数据表非常大 (40+W 条记录 ) 的时候线性查询的通病。可以通过对 En 属性创建索引,加快速度。

创建索引的 sql 命令格式为:

CREATE [UNIQUE] INDEX [IF NOT EXISTS] [database-name .] index-name

            ON table-name ( column-name [, column-name]* )

所以只需要输入: create index indexEn ON DictCnToEn(En) 就能对 En 创建索引,这之后,原本 20M 的数据库文件瞬间变成了 30M

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值