工厂的考勤机是依时利ER-880D,当初没有带系统,只一个接口软件读出来的数据是.txt文件,如下:
0000924088 2006-05-19 17:44:09 6 0
0000924029 2006-05-19 17:44:51 6 0
0000926837 2006-05-19 17:44:55 6 0
0003477721 2006-05-19 18:02:20 6 0
0000929319 2006-05-19 18:30:05 6 0
...,现在我想用delphi自已开发一个考勤系统出来,但不知道怎么样把.txt文本文件转换成access数据库文件??请指点.

解决方案 »

  1.   

    忘了留邮箱,嘻嘻
    [email protected]
      

  2.   

    unit drsj;//一个条码导入的程序 实现从txt文件导入到access txt每行三条数据interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, StdCtrls, Grids, DBGrids;type
      TForm3 = class(TForm)
        Button1: TButton;
        OpenDialog1: TOpenDialog;
        ADOQuery1: TADOQuery;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        Label1: TLabel;
        Edit1: TEdit;
        Label2: TLabel;
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form3: TForm3;
      coon: string;
    implementation
    uses jdfrm, dmfrm;{$R *.dfm}procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      action := cafree;
    end;procedure TForm3.FormDestroy(Sender: TObject);
    begin
      Form3 := nil;
    end;procedure DetachString(var SaveSt: TStringList; const DetachSt, DetachCh: string);
    var
      DetachLen: Integer;
      St, S, Str: string;
      i: Integer;
    begin
      St := DetachSt;
      S := DetachCh;
      DetachLen := Length(DetachCh);
      if SaveSt = nil then
        Exit;  while True do
      begin
        i := Pos(S, St);
        if i <= 0 then
        begin
          if St <> '' then
            SaveSt.Add(St);
          break;
        end;
        Str := Copy(St, 0, i - 1);
        St := Copy(St, i + DetachLen, Length(DetachSt) - i);
        SaveSt.Add(Str);
      end;
    end;
    procedure TForm3.Button1Click(Sender: TObject);
    var
      filename: string;
      slist, str: tstringlist;
      i: integer;
      s, rcklb, strsql: string;
      cxquery: Tadoquery;begin
      rcklb := '';
      slist := Tstringlist.Create; //存放文件所有内容--声明
      if opendialog1.Execute then
      begin
        filename := opendialog1.FileName;
        slist.LoadFromFile(filename); //实现
        for i := 0 to slist.Count - 1 do //循环实现对每行操作
        begin      str := Tstringlist.Create;
          s := slist[i];
          Detachstring(str, s, ','); //调用自定义函数 分割字符串(针对每行重复操作)
          if str.Count = 3 then //屏蔽非标准数据
          begin
            if not assigned(jdform) then //标识导入进程
            begin
              jdform := Tjdform.Create(application);
              jdform.Show;
            end;
            jdform.ProgressBar1.Max := slist.Count-2;
            //查询数据库 得出入库出库标识
            cxquery := Tadoquery.Create(self);
            cxquery.Connection := dmform.Adoconnection1;
            with cxquery do
            begin
              close;
              sql.Text := 'select * from ry where bh=''' + str[0] + '''';
              open;
              if not eof then //检查当前数据是条码还是入出库标识
              begin
                rcklb := fieldbyname('rm').AsString;
                continue; //如果是标识 此条数据不保存 保存接下来的数据
              end;
              if rcklb <> '' then //主要目的为屏蔽第一条标识数据
              begin
                close;
                strsql := 'insert into tm(tm,ckr,smrq,smsj,sj) values(''' + str[0] + ''',';
                strsql := strsql + '''' + rcklb + ''',''' + str[1] + ''',''' + str[2] + ''',';
                strsql := strsql + '#' + FormatDateTime(' yyyy - MM - dd ', date) + '#)';
                sql.Text := strsql;
                ExecSQL;
                dbgrid1.Columns[0].Width:=50;
              end;
            end;
          end
          else
          begin
            showmessage('检测到不符合格式数据,读取中止!');
            str.Free;
            slist.Free;
            if jdform <> nil then
              jdform.Close;
            exit;
          end;
          str.Free;
          jdform.ProgressBar1.Position := i;
        end;
        slist.Free;
        showmessage('        输入成功       !');  end;
      if jdform <> nil then
        jdform.Close;
      adoquery1.Close;
      adoquery1.SQL.Clear;
      adoquery1.SQL.Add('select * from tm order by sj desc,smrq desc,smsj desc');
      adoquery1.Open;
      edit1.Text := inttostr(adoquery1.RecordCount);
    end;end.
      

  3.   

    一条sql语句可以搞定adoCoon.Connected:=false;
      SQLStr:='insert into tb select * From [Text;Database=c:\temp\;Format=Delimited()].'a.txt;
    adoCoon.Execute(SQLStr);建议去delphibbs参考碧血剑的文章,关于异构数据库之间的数据转换
      

  4.   

    补充,我上面的默认分隔符是空格,你上面用的是Tab分隔符,所以你可能需要Schema.ini
    用上面的办法,效率十分的高,而且语句简单明了,不过你需要去了解什么是Schema.ini,建议多用google
      

  5.   

    通过行读当然也可以,但是你可以用一条sql语句搞定的,何乐而不为呢?
    再说对错误的控制也比较好处理
      

  6.   

    插一句,Schema.ini是怎么用呢?刚查了一下,ACCESS到TXT会自动生成,但TXT到ACCESS也会吗。
    小菜我,只想学习学习。
      

  7.   

    采用Rubi的办法,能解决很多问题。
      

  8.   

    to
    jascha_x:
    建议去delphibbs参考碧血剑的文章,关于异构数据库之间的数据转换你看了之后,很多疑问都会很清楚,txt,excel,access,sql server相互之间可以互相转换
      

  9.   

    http://www.tongyi.net/article/20031101/200311013786.shtml