在我们日常工作中,常会碰到这样一个难题:一大堆收集好的纯文本格式,比较规整的资料怎样才能将它们分离,转到自己已经建好的数据库中进行管理呢?
例如,有一段人事档案资料archive.txt,内容如下:
| 小许 | 男 | 21 | 工程师 |
| 小吴 | 女 | 23 | 助理工程师 |
| 小蔡 | 男 | 22 | 助理工程师 |
| 小牟 | 女 | 22 | 工程师 |
要将它转入数据库archive.dbf中,archive.dbf结构如下:
姓名,性别,年龄,职称
怎么办呢?现在通过使用delphi编程,很好地解决了这个难题。delphi提供了许多功能强大,丰富的字符处理函数和过程,常用的有:
(1)function length(s:string):integer返回串的长度
(2)function copy(s:string;index,count:integer):string 给出一个字符串中串的拷贝
(3)function pos(substr:string;s:string);integer 查找子串在字符串中的位置
(4)procedure delete(vars:string;index,count:integer);从一个字符串中去除子串
利用delphi提供的已有函数和过程基础上编制自己的三个函数,实现了纯文本格式资料转入数据库功能。只要delphi支持的数据库都可以支持。
archive.txt中每行数据为一个字符串,字符串中每个被分割的数据为一个字段,分割每个字段的字符为分割符,这里是空格,也可以是,、;、#等符号。具体思想是:先将字符串进行调整,然后把串中每个字符同分割符比较,将不是分割符的字符追加到mystr串中,最后得到一个字段的内容。通过一个循环,就可以将一个字符串分成几个字段。
function regulate(astring,sepchar:string):string 去掉多余的分割符,规范字符串
function getsubstr(varsst g:string;sepchar:string):string;得到字符串中一个子串,因要改变参数astring的值,所以将它用var定义。
functiongetsubstrnum(astring,sepchar:string):integer;计算一个字符串要被分割成几个字段。
参数:astring是所需分割的一个字符串,sepchar是分割符。
function regulatestr(astring:string;sepchar:string):string;
var
i,num:integer;
flag:boolean;
mystr,tempstr:string;
begin
flag:=false;进行标志,去除多余的分割符
num:=length(astring); 计算astring串的长度
for i:=1 to num do
begin
tempstr:=copy(astring,i,1);取astring串中的一字符
if tempstr sepchar then
begin
mystr:=mystr+tempstr;
flag:=true;
end
else
if(flag = true)then
begin
mystr:=mystr+tempsrt;
flag:=false;
end;
end;
if mystr[length(mystr)] sepchar then
mystr:=mystr+sepchar;
regulatesrt:=mystr;
end;
function getsubstr(var astring:string,sepchar:strign):string;
var
mysrt:string;
strlen:integer;
sepcharpso:integer;
begin
strlen:=length(astring);
sepcharpos:=pos(sepchar,astring);计算分割符在子串中的位置
mystr:=copy(astring,1,sepcharpos-1); 将分割符前所有字符放到mystr串中
delete(astring,1,sepcharpos);除去分割符和分割符前的子串
getsubstr:=mystr;返回一个字段
end;
functiontforml.getsubstrnum(astring:string;sepchar:string):integer;
var
i:integer;
strlen:integer;
num:integer;
begin
strlen:=length(astring);
num:=0;
for i:=1 to strlen do
if copy(astring,i,1) = sepcharthen
num:=num+1;
getsubsrtnum:=num;
end;
有了上面三个函数,现在介绍一下具体的应用:
1.首先建立一个窗体forml,加入一个richeditl(或menol),一个按钮buttonl和一个tablel,设置tablel的属性:
tablell.database = c:\archivs
tablell.tablename =archive.dbf
2.分别加入以下程序:
const space=
proceduretforml.formcreate(sender:tobject);
begin
richrditl.lines.loadfromfile(archive.txt);
end;
proceduretforml.button1click(sender:tobject);
var
i,j:integer;
myline:string;
begin
with tablel do
begin
open;
for i:=0 to richeditl.lines.count-1 do
begin
myline:=regulatestr(richeditl.lines[i],space);
for j:=1 to num do
begin
append;
fileds[j-1].astring:=getsubsrt(myline,space));
post;
end;
end;
end;
end;
然后就可以进行编译,运行了。此程序在win95/delphi2.0下调试通过。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器