灵活使用字符串函数将TXT导入数据库
技术与开发
读者:我想将HTML、DOC、TXT等格式的文本资料分离后转到自己已经建好的数据库中进行管理,请问如何办到呢?
小编:很简单,先把文本资料导入到程序的文本控件中,再使用字符串处理函数对字符串进行筛选分离后写到数据库中就可以了。
字符串函数在我们的程序设计中广泛被使用,使用字符串函数我们可以对大段文本资料进行处理,特别是对一段文字进行筛选分类、统计文字的字数、根据不同的需要提取大段文字中的部分字符、查找特定字符等等,使用字符串函数将大大提高编程效率。
下面以比较规整的文本文件的内容(如下图)导入已经建好的数据库为例讲解字符串函数的使用方法:

设计思路:
a.txt中每行数据为一个字符串,字符串中每个被分割的数据为一个字段,分割每个字段的字符为分割符,这里是逗号,也可以是、; #等符号。具体思想是:先将字符串进行调整,然后把串中每个字符同分割符比较,将不是分割符的字符追加到MyStr串中,最后得到一个字段的内容。通过一个循环,就可以将一个字符串分成几个字段。最后把字段写到数据库中。
需要使用的函数和过程
① function Length(S:String):Integer//返回串的长度
② function Copy(S:String; Index,Count: Integer):String//给出一个字符串中串的拷贝
③ function Pos(Substr:String; S:String); Integer//查找子串在字符串中的位置
④ Procedure Delete(Var S:String; Index,Count: Integer); //从一个字符串中去除子串
第一步:启动Delphi,新建一个项目,在主窗体上添加一个Memo1、一个OpenDialog1、三个Button、一个ADOTable1。

◆设置ADOTable1的属性
ADOTable1的ConnectionString的属性设置为Provider=SQLOLEDB.1;Password=111;Persist Security Info=True;User ID=sa;Initial Catalog=L3_Oracle;Data Source=CSH\SQL,和一个数据库连接。
ADOTable1的TableName的属性设置为test,绑定到“L3_Oracle”数据库的“test”表。
ADOTable1的Name的属性设置为Table1.
◆设置OpenDialog1的Filter的属性为*.txt,使打开对话框只能打开txt文件。
◆定义全局变量
const
SepChar=',' ;//a.txt中是以逗号分隔各字符串(字段的),所以定义常量SepChar为逗号,作用是利用此常量把Memo的行取出各个字符串。
第二步:在浏览按钮中添加下面代码:
procedure TForm1.Button2Click(Sender: TObject);
begin
if OpenDialog1.execute then
Memo1.Lines.LoadFromFile(openDialog1.filename);
end;//把TXT文件的内容写到Memo中。
第三步:在导入按钮中添加下面代码:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,num:Integer;
MyLine:String;
item:array[1..4] of string;
begin
For i:=0 to Memo1.Lines.Count-1 do//扫描Memo的每一行
begin
MyLine:=Memo1.Lines[i];//取出每一行的字符串,赋值给变量MyLine
num:=GetSubStrNum(myline,SepChar);//调用子函数,得到这一行的字符串(字段)的个数
for j:=1 to num do
item[j]:=GetSubStr(myline,SepChar); //调用子函数,分别取出各个字符串(字段)
table1.open;
with table1 do
begin
table1.insert;
table1.FieldByName('name').AsString:=item[1];//把取出的字符串写到数据库的test表中
…………
table1.post;
end;
table1.close;
end;
MessageDlg('数据导入成功!', mtInformation,[mbOk], 0);
end;
第四步:添加GetSubStrNum子函数代码
Function GetSubStrNum(aString:String;SepChar:String):integer;
var
i:Integer;
StrLen:Integer;
Num:Integer;
begin
StrLen:=Length(aString);//计算Memo的一行的长度
Num:=0;
For i:=1 to StrLen do
If Copy(aString,i,1) = SepChar then//一个字符一个字符的扫描,如果扫描到字符为“,”则num加1,表示字段的个数加1
Num:=Num+1;
result:=Num;
end;
第五步:添加GetSubStr子函数代码
Function GetSubStr(var aString:String;SepChar:String):String;
var
Mystr:String;
StrLen:Integer;
SepCharPos:Integer;
begin
StrLen:=Length(aString);
SepCharPos:=Pos(SepChar,aString); //计算分割符在子串中的位置
MyStr:=Copy(aString,1,SepCharPos-1); //将分割符前所有字符放到mystr串中
Delete(aString,1,SepCharPos); //除去分割符和分割符前的子串
GetSubStr:=MyStr; //返回一个字段
end;运行后的画面见下图:

总结
把TXT等类型的文件写到数据库中,其实就是先把TXT读到Memo或者RichEdit等文本框中,然后使用字符串处理函数分别把需要的字符串取出来写到数据库中。
字符串函数很多,我们在程序设计过程中,根据实际需要选择相应的字符串函数来实现功能会达到事半功倍的效果,比如统计分析每一期双色球的数字、足球彩票等等,使用字符串函数都会大大提高程序的效率。