明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

文本數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫的方法

[摘要]有一段人事檔案資料archive.txt,內(nèi)容如下:   小許男21工程師   小吳女23助理工程師   小蔡男22助理工程師   小牟女22工程師   要將它轉(zhuǎn)入數(shù)據(jù)庫archive.dbf中,a...
有一段人事檔案資料archive.txt,內(nèi)容如下:
  小許男21工程師
  小吳女23助理工程師
  小蔡男22助理工程師
  小牟女22工程師

  要將它轉(zhuǎn)入數(shù)據(jù)庫archive.dbf中,archive.dbf結(jié)構(gòu)如下:
  姓名,性別,年齡,職稱

  怎么辦呢?現(xiàn)在通過使用delphi編程,很好地解決了這個(gè)難題。Delphi提供了許多功能強(qiáng)大,豐富的字符處理函數(shù)和過程,常用的有:
  (1)function Length(S:String):Integer//返回串的長度
  (2)function Copy(S:String;Index,Count:Integer):String//給出一個(gè)字符串中串的拷貝
  (3)function Pos(Substr:String;S:String);Integer//查找子串在字符串中的位置
  (4)Procedure Delete(VarS:String;Index,Count:Integer); 。瘡囊粋(gè)字符串中去除子串

  利用Delphi提供的已有函數(shù)和過程基礎(chǔ)上編制自己的三個(gè)函數(shù),實(shí)現(xiàn)了純文本格式資料轉(zhuǎn)入數(shù)據(jù)庫功能。只要Delphi支持的數(shù)據(jù)庫都可以支持。

  archive.txt中每行數(shù)據(jù)為一個(gè)字符串,字符串中每個(gè)被分割的數(shù)據(jù)為一個(gè)字段,分割每個(gè)字段的字符為分割符,這里是空格,也可以是,、;、#等符號(hào)。具體思想是:先將字符串進(jìn)行調(diào)整,然后把串中每個(gè)字符同分割符比較,將不是分割符的字符追加到MyStr串中,最后得到一個(gè)字段的內(nèi)容。通過一個(gè)循環(huán),就可以將一個(gè)字符串分成幾個(gè)字段。

  Function Regulate(aString,Sepchar:string):string  。サ舳嘤嗟姆指罘,規(guī)范字符串
  Function GetSubStr(varsString:string;SepChar:String):String;  //得到字符串中一個(gè)子串,因要改變參數(shù)aString的值,所以將它用var定義。
  FunctionGetSubStrNum(aString,SepChar:String):Integer; 。(jì)算一個(gè)字符串要被分割成幾個(gè)字段。
  參數(shù):aString是所需分割的一個(gè)字符串,SepChar是分割符。

  Function RegulateStr(aString:String;Sepchar:String):String;  
  var
    i,Num:Integer;
    Flag:Boolean;
    MyStr,TempStr:String;
  begin
    Flag:=False;//進(jìn)行標(biāo)志,去除多余的分割符
    Num:=Length(aString);//計(jì)算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);//計(jì)算分割符在子串中的位置
    MyStr:=Copy(aString,1,SepCharPos-1); //將分割符前所有字符放到mystr串中
    Delete(aString,1,SepCharPos);//除去分割符和分割符前的子串
    GetSubStr:=MyStr;//返回一個(gè)字段
  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;

  有了上面三個(gè)函數(shù),現(xiàn)在介紹一下具體的應(yīng)用:
  1.首先建立一個(gè)窗體Forml,加入一個(gè)RichEditl(或Menol),一個(gè)按鈕Buttonl和一個(gè)Tablel,設(shè)置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;