设计考勤系统,有一难点:如何把.txt文本文件转换成access数据库文件?用程序实现.

wave_f 2006-06-06 09:07:26
工厂的考勤机是依时利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数据库文件??请指点.
...全文
453 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rubi 2006-06-06
  • 打赏
  • 举报
回复
http://www.tongyi.net/article/20031101/200311013786.shtml
Rubi 2006-06-06
  • 打赏
  • 举报
回复
to
jascha_x:
建议去delphibbs参考碧血剑的文章,关于异构数据库之间的数据转换

你看了之后,很多疑问都会很清楚,txt,excel,access,sql server相互之间可以互相转换
LukyDee 2006-06-06
  • 打赏
  • 举报
回复
采用Rubi的办法,能解决很多问题。
jascha_x 2006-06-06
  • 打赏
  • 举报
回复
插一句,Schema.ini是怎么用呢?刚查了一下,ACCESS到TXT会自动生成,但TXT到ACCESS也会吗。
小菜我,只想学习学习。
Rubi 2006-06-06
  • 打赏
  • 举报
回复
通过行读当然也可以,但是你可以用一条sql语句搞定的,何乐而不为呢?
再说对错误的控制也比较好处理
myanwei 2006-06-06
  • 打赏
  • 举报
回复
这个应该很简单吧?通过行读也很方便的.
Rubi 2006-06-06
  • 打赏
  • 举报
回复
补充,我上面的默认分隔符是空格,你上面用的是Tab分隔符,所以你可能需要Schema.ini
用上面的办法,效率十分的高,而且语句简单明了,不过你需要去了解什么是Schema.ini,建议多用google
Rubi 2006-06-06
  • 打赏
  • 举报
回复
一条sql语句可以搞定

adoCoon.Connected:=false;
SQLStr:='insert into tb select * From [Text;Database=c:\temp\;Format=Delimited()].'a.txt;
adoCoon.Execute(SQLStr);

建议去delphibbs参考碧血剑的文章,关于异构数据库之间的数据转换
deansroom 2006-06-06
  • 打赏
  • 举报
回复
unit drsj;//一个条码导入的程序 实现从txt文件导入到access txt每行三条数据

interface

uses
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.

KL2 2006-06-06
  • 打赏
  • 举报
回复
忘了留邮箱,嘻嘻
KL-2@163.com
slipsun 2006-06-06
  • 打赏
  • 举报
回复
关注!
KL2 2006-06-06
  • 打赏
  • 举报
回复
你可以把文件发给我,我有空帮你写这个函数也可以
KL2 2006-06-06
  • 打赏
  • 举报
回复
应该不超过50行代码
KL2 2006-06-06
  • 打赏
  • 举报
回复
一行一行读出来,然后通过空格分拆,然后插入数据库

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧