我现在要做一个考勤系统,要求从每一个存放当天打卡时间的文本文档中读取数据,里面的数据是这样格式的:
00015502(工号)00046098(卡号)20051101(日期)075000(时间)P10(表示打上班卡)
00015502(工号)00046098(卡号)20051101(日期)165000(时间)P20(表示打下班卡)因为每人每天都会有多次打上下班卡的情况,所以文本里面有大量不需要的数据,我现在需要从这些数据中提取当天最早上班时间和当天最晚的下班时间,然后将需要的数据加入到数据库中,请问我该怎么做比较有效率,有经验的朋友一定要指点一下,我现在是急死了。非常感谢!

解决方案 »

  1.   

    hi,Cassava(车超)
    我现在不是要什么考勤状态,我是要从一大堆TXT数据中提取当日最早上班打卡时间和当日最晚下班打卡时间?这样一个动作怎么实现
      

  2.   

    假如我现在将3天的TXT文档中的数据导入到StringList里面,然后对StringList作Sort,里面的数据类似这样:

    00001032(卡号)20051101(日期)074841(时间)P10(上班卡)
    0000103220051101074845P10
    00001032(卡号)20051101(日期)190053(时间)P20(下班卡)
    0000103220051102075007P10
    0000103220051102200007P20
    0000103220051103075351P10
    0000103220051103190403P20
    0000106720051101075614P10
    0000106720051101190308P20
    0000106720051102080101P10
    0000106720051102200010P20
    0000106720051103075524P10
    0000106720051103190347P20
    然后从这一堆数据中提取最早上班和最晚下班时间,算法怎么去写?我的想法是按照先判断卡号,然后再判断同一个卡号里面同一天的P10取最早时间,同一天的P20取最晚时间,请高手指点一下,非常感谢,急。
    解决好马上给分!
      

  3.   

    我这样写可是有错误出现?"EStringListError:List index out of bounds(5277)"
    请帮忙看看,谢谢
    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;
      

  4.   

    hi,ypnet(高原)
    如果先导入到数据库再处理,会比较麻烦吧,要怎么做呢?能不能具体指教一下
      

  5.   

    vSearchRec: TSearchRec;
        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 日期