我现在要做一个考勤系统,要求从每一个存放当天打卡时间的文本文档中读取数据,里面的数据是这样格式的:
00015502(工号)00046098(卡号)20051101(日期)075000(时间)P10(表示打上班卡)
00015502(工号)00046098(卡号)20051101(日期)165000(时间)P20(表示打下班卡)因为每人每天都会有多次打上下班卡的情况,所以文本里面有大量不需要的数据,我现在需要从这些数据中提取当天最早上班时间和当天最晚的下班时间,然后将需要的数据加入到数据库中,请问我该怎么做比较有效率,有经验的朋友一定要指点一下,我现在是急死了。非常感谢!
00015502(工号)00046098(卡号)20051101(日期)075000(时间)P10(表示打上班卡)
00015502(工号)00046098(卡号)20051101(日期)165000(时间)P20(表示打下班卡)因为每人每天都会有多次打上下班卡的情况,所以文本里面有大量不需要的数据,我现在需要从这些数据中提取当天最早上班时间和当天最晚的下班时间,然后将需要的数据加入到数据库中,请问我该怎么做比较有效率,有经验的朋友一定要指点一下,我现在是急死了。非常感谢!
我现在不是要什么考勤状态,我是要从一大堆TXT数据中提取当日最早上班打卡时间和当日最晚下班打卡时间?这样一个动作怎么实现
00001032(卡号)20051101(日期)074841(时间)P10(上班卡)
0000103220051101074845P10
00001032(卡号)20051101(日期)190053(时间)P20(下班卡)
0000103220051102075007P10
0000103220051102200007P20
0000103220051103075351P10
0000103220051103190403P20
0000106720051101075614P10
0000106720051101190308P20
0000106720051102080101P10
0000106720051102200010P20
0000106720051103075524P10
0000106720051103190347P20
然后从这一堆数据中提取最早上班和最晚下班时间,算法怎么去写?我的想法是按照先判断卡号,然后再判断同一个卡号里面同一天的P10取最早时间,同一天的P20取最晚时间,请高手指点一下,非常感谢,急。
解决好马上给分!
请帮忙看看,谢谢
sDataStringList.Sort;
sEmpNo := LeftStr(sDataStringList[0],8);
sDate:=copy(sDataStringList[0],9,8);
sText:=rightstr(sDataStringList[0],3);
for R:=1 to sDataStringList.Count-1 do
begin
if (sEmpNo=LeftStr(sDataStringList[R],8)) then
begin
if (sDate=copy(sDataStringList[R],9,8)) and (sText=rightStr(sDataStringList[R],3)) then
begin
if(rightStr(sDataStringList[R],3)='P10') then
sDataStringList.Delete(R)
else
sDataStringList.Delete(R-1);
end
else
begin
sEmpNo := LeftStr(sDataStringList[R],8);
sDate:=copy(sDataStringList[R],9,8);
sText:=rightstr(sDataStringList[R],3);
end;
end
else
begin
sEmpNo := LeftStr(sDataStringList[R],8);
sDate:=copy(sDataStringList[R],9,8);
sText:=rightstr(sDataStringList[R],3);
end;
end;
for R:=0 to sDataStringList.Count-1 do
begin
{with gtemp1 do
begin
if copy(sDataStringList[R],1,4)='0000' then
gtemp1.employee_no:=copy(sDataStringList[R],5,4)
else
gtemp1.employee_no:=copy(sDataStringList[R],4,5);
gtemp1.g_date:=copy(sDataStringList[R],17,8);
gtemp1.g_time:=copy(sDataStringList[R],25,2)+':'+copy(sDataStringList[R],27,2);
gtemp1.text:=copy(sDataStringList[R],31,3);
end; }
if copy(sDataStringList[R],1,4)='0000' then
begin
with dm.Query1 do
begin
close;
sql.Clear;
sql.Text:='insert into ":hr:gsw1.db" (Employee_No,G_date,G_time,Text)';
sql.Append('values("'+copy(sDataStringList[R],5,4)+'","'+copy(sDataStringList[R],9,8)+'","'+copy(sDataStringList[R],17,2)+':'+copy(sDataStringList[R],19,2)+'","'+copy(sDataStringList[R],23,3)+'")');
prepare;
execsql;
end;
end
else
begin
with dm.Query1 do
begin
close;
sql.Clear;
sql.Text:='insert into ":hr:gsw1.db" (Employee_No,G_date,G_time,Text)';
sql.Append('values("'+copy(sDataStringList[R],4,5)+'","'+copy(sDataStringList[R],9,8)+'","'+copy(sDataStringList[R],17,2)+':'+copy(sDataStringList[R],19,2)+'","'+copy(sDataStringList[R],23,3)+'")');
prepare;
execsql;
end;
end;
如果先导入到数据库再处理,会比较麻烦吧,要怎么做呢?能不能具体指教一下
K: Integer;
str : string;
begin
K := FindFirst('d:\'+ '*.txt', faAnyFile, vSearchRec); while K = 0 do
begin
if Pos(vSearchRec.Name, '..') = 0 then
begin adoquery1.Close;
adoquery1.SQL.Clear;
str := vSearchRec.Name; adoquery1.SQL.Add('bulk insert AIS20050919163509..hl_employee from ''d:\'+ str+''' with (DATAFILETYPE = ''char'',FIELDTERMINATOR = ''\n'',ROWTERMINATOR = ''\n'')');
adoquery1.ExecSQL;
// showmessage(adoquery1.SQL.Text);
K := FindNext(vSearchRec); end;
end;
FindClose(vSearchRec);
//////////////将D盘下的所有.txt文件导入数据库中的AIS20050919163509..hl_employee 表中select distinct substring(ysdata,1,8)as 工号, substring(ysdata,9,7)as 日期, substring(ysdata,17,6)as 时间, substring(ysdata,24,3)as打卡机 into #hl_employee8
from hl_employee
/////////存为另一个临时表
select min(时间) from #hl_employee8 where 打卡机=p10 group by 日期
union
select max(时间) from #hl_employee8 where 打卡机=p20 group by 日期