我稍微该了下,没有调试,其实也没什么问题,就是敲错了几个地方,
主要就是全角字符的问题,你可以自己改的。在我们日常工作中,常会碰到这样一个难题:一大堆
收集好的纯文本格式,比较规整的资料怎样才能将它们分
离,转到自己已经建好的数据库中进行管理呢? 例如,有一段人事档案资料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(Var S: String; Index, Count: Integer); //从一个字符串中去除子串 利用Delphi提供的已有函数和过程基础上编制自己的
三个函数, 实现了纯文本格式资料转入数据库功能。只要
Delphi支持的数据库都可以支持。 archive.txt中每行数据为一个字符串, 字符串中每
个被分割的数据为一个字段, 分割每个字段的字符为分割
符, 这里是空格, 也可以是, 、; 、#等符号。具体思想
是: 先将字符串进行调整, 然后把串中每个字符同分割符
比较, 将不是分割符的字符追加到MyStr串中, 最后得到
一个字段的内容。通过一个循环, 就可以将一个字符串分
成几个字段。 function Regulate(aString, Sepchar: string): string //去掉多余的分割符, 规范字符串 function GetSubStr(var sString: string; SepChar: String): String; //得到字符串中一个子串 //因要改变参数aString的值, 所以将它用var定义。 function GetSubStrNum(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); //取aStrin
g串中的一字符 if TempStr <> SepChar then begin MyStr := MyStr + TempDtr; 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: String): String; var Mysrt: 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; function Tforml.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) = SepChar then Num := Num + 1; GetSubSrtNum := Num; end; 有了上面三个函数, 现在介绍一下具体的应用: 1.首先建立一个窗体forml, 加入一个RichEditl(或Memol), 一个按钮Buttonl和一个Tablel, 设置Tablel
的属性: Tablell.DataBase := 'Archive'; Tablell.TableName := 'Archive.dbf' 2.分别加入以下程序: ConstSpace = '' procedure Tforml.formCreate(Sender: Tobject); begin RichRditl.Lines.LoadFromFile('Archive.txt'); end; procedure Tforml.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 NumToken(MyLIne, Space) do begin Append; fileds[j-1].asString := GetSubSrt(MyLine, Space); post; end; end; end; end;
主要就是全角字符的问题,你可以自己改的。在我们日常工作中,常会碰到这样一个难题:一大堆
收集好的纯文本格式,比较规整的资料怎样才能将它们分
离,转到自己已经建好的数据库中进行管理呢? 例如,有一段人事档案资料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(Var S: String; Index, Count: Integer); //从一个字符串中去除子串 利用Delphi提供的已有函数和过程基础上编制自己的
三个函数, 实现了纯文本格式资料转入数据库功能。只要
Delphi支持的数据库都可以支持。 archive.txt中每行数据为一个字符串, 字符串中每
个被分割的数据为一个字段, 分割每个字段的字符为分割
符, 这里是空格, 也可以是, 、; 、#等符号。具体思想
是: 先将字符串进行调整, 然后把串中每个字符同分割符
比较, 将不是分割符的字符追加到MyStr串中, 最后得到
一个字段的内容。通过一个循环, 就可以将一个字符串分
成几个字段。 function Regulate(aString, Sepchar: string): string //去掉多余的分割符, 规范字符串 function GetSubStr(var sString: string; SepChar: String): String; //得到字符串中一个子串 //因要改变参数aString的值, 所以将它用var定义。 function GetSubStrNum(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); //取aStrin
g串中的一字符 if TempStr <> SepChar then begin MyStr := MyStr + TempDtr; 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: String): String; var Mysrt: 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; function Tforml.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) = SepChar then Num := Num + 1; GetSubSrtNum := Num; end; 有了上面三个函数, 现在介绍一下具体的应用: 1.首先建立一个窗体forml, 加入一个RichEditl(或Memol), 一个按钮Buttonl和一个Tablel, 设置Tablel
的属性: Tablell.DataBase := 'Archive'; Tablell.TableName := 'Archive.dbf' 2.分别加入以下程序: ConstSpace = '' procedure Tforml.formCreate(Sender: Tobject); begin RichRditl.Lines.LoadFromFile('Archive.txt'); end; procedure Tforml.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 NumToken(MyLIne, Space) do begin Append; fileds[j-1].asString := GetSubSrt(MyLine, Space); post; end; end; end; end;
Tablell.DataBase:=′c:ιArchivs′
Tablell.TableName:=′Archive.dbf′"
在哪里设置,是不是在‘object inspector’的table1的properties选项中设置呢?
unit txttodb;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, DBTables;type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
Button1: TButton;
Table1: TTable;
function Regulate(aString,Sepchar:string):string;
function GetSubStr(var aString:string;SepChar:String):String;
function GetSubStrNum(aString,SepChar:String):Integer;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
implementation{$R *.dfm}
function RegulateStr(aString:String;Sepchar:String): String;var
i,Num:Integer;
Flag:Boolean;
MyStr,TempStr: String;
beginFlag := False;
Num := Length(aString);
for i :=1 to Num dobeginTempStr := Copy(aString,i,1);
if TempStr <> SepChar thenbeginMyStr := MyStr + TempStr;Flag := True;endelseif(Flag = True)thenbeginMystr := Mystr + TempStr;Flag := False;end;end;if MyStr[Length(MyStr)] <> SepChar thenMyStr := MyStr+SepChar;RegulateStr :=MyStr;end;function GetSubStr(var aString:String;SepChar:String):String;varMystr: String;StrLen: Integer;SepCharPos: Integer;beginStrLen := Length(aString);SepCharPos := Pos(SepChar,aString);
MyStr :=Copy(aString,1,SepCharPos-1);Delete(aString,1,SepCharPos); GetSubStr:=MyStr;
end;function TForml.GetSubStrNum(aString:String;SepChar:String):Integer;vari:Integer;StrLen:Integer;Num : Integer;beginStrLen := Length(aString);Num:=0;for i:=1 to StrLen doif Copy(aString,i,1)=SepChar thenNum :=Num+1;GetSubStrNum := Num;end;Const
Space=''procedure TForml.formCreate(Sender: Tobject);beginRichEditl.Lines.LoadFromFile('mytext.txt');end;procedure TForml.Button1Click(Sender: Tobject);vari, j: Integer;MyLine: String;beginwith Tablel dobeginOpen;for i := 0 to RichEditl.Lines.Count-1 dobeginMyLine := RegulateStr(RichEditl.Lines[i],Space);for j := 1 to NumToken(MyLIne, Space) dobeginAppend;fileds[j-1].aString:=GetSubStr(MyLine,Space);Post;end;end;end;end.