全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1059
推到 Plurk!
推到 Facebook!

关于从TXT文档读取数据到table中

尚未結案
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-26 09:03:46 IP:218.20.xxx.xxx 未訂閱
请教各位前辈: 我要从一个存放员工上下班打卡时间的TXT文档中提取"下班打卡时间的最后一条记录",要怎样去做? 数据例如这样: (1) 。。。。。。 000173820000254A20041214004500P20 000173820000254A20041214004500P20----P20代表打下班卡 000173820000254A20041214004500P20----取这一条 。。。。。。 或者这样: (2) 。。。。。。 000173820000254A20041214004500P20 000173820000254A20041214004600P20 000173820000254A20041214004700P20----取这一条 。。。。。。 取相同员工号的下班打卡最晚的记录。
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-26 10:01:00 IP:203.69.xxx.xxx 未訂閱
請問 000173820000254A20041214004500P20 格式是怎樣組成的? 173820 是 指 17:38:20 嗎? 可否詳述一下?
way888
初階會員


發表:32
回覆:76
積分:36
註冊:2005-05-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-26 10:33:27 IP:220.136.xxx.xxx 未訂閱
Hi liangzai 您好 你的問題與我之前遇到的情況一樣 其實你可以要求卡鐘廠商讓資料下載到MDB資料庫既可 省掉一些轉TXT的麻煩,我之前就是這樣做,後來用MDB就省事很多 真要轉的話,也應該是把他轉到資料庫,才會有實用價值 將之轉到資料庫後再SQL出來你要的東西
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-26 14:47:01 IP:218.20.xxx.xxx 未訂閱
hi,malanlk 信息如下: 00017382 ----employee no 0000254A ----card no,不用管它 20041214 ----Date 004500 ----Time P20 ----代表下班,P10代表上班
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-26 15:52:16 IP:203.69.xxx.xxx 未訂閱
procedure TForm1.Button1Click(Sender: TObject);
var
  sDataStringList: TStringList;
  i: Integer;
  sEmpNo: String;
begin
  sDataStringList := TStringList.Create;
  try
    sDataStringList.LoadFromFile('Data.txt');
    // 清掉長度不對,或非下班的的資料
    for i:=sDataStringList.Count-1 downto 0 do
    begin
      if (Length(sDataStringList[i])<>33) then
      begin
        sDataStringList.Delete(i);
        continue;
      end;
      if ('P20'<>RightStr(sDataStringList[i],3)) then
        sDataStringList.Delete(i);
    end;        if (sDataStringList.Count>0) then
    begin
      sDataStringList.Sort;
      sEmpNo := LeftStr(sDataStringList[sDataStringList.Count-1],8);
      for i:=sDataStringList.Count-2 downto 0 do
      begin
        if sEmpNo=LeftStr(sDataStringList[i],8) then
          sDataStringList.Delete(i)
        else
          sEmpNo := LeftStr(sDataStringList[i],8);
      end;
    end;
    sDataStringList.SaveToFile('DataResult.txt');
  finally
    sDataStringList.Free;
  end;
end;
Data.txt 資料檔 DataResult.txt 檔內就是你要的結果 隨便寫寫, 請自行 Debug 發表人 - malanlk 於 2005/08/26 15:57:59
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-26 15:59:09 IP:203.69.xxx.xxx 未訂閱
程式修正過哦...
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-29 14:42:59 IP:218.20.xxx.xxx 未訂閱
hi,malanlk 首先谢谢你的指教,我试过了,可以做到。 但是我现在的情况是这样的: (1)每一个TXT文档中里面存放着所有上下班,也就是P10(上班打卡),P20(下班打卡)的所有数据,一个月就会有31个TXT文档,我现在是通过opendialog将31个文档选中,一次性全部的读入到table中,其中P10的记录取同员工号同一天最早的记录,我使用locate来实现的,P20的纪录就要取同员工号同一天最晚的记录;(2)我希望能一次性将所有记录都写到table中,不要再转到另一个txt文档再读至table中这样; 能不能再指教一下,非常感谢! 现行的代码: procedure TForm1.BitBtn1Click(Sender: TObject); begin if(opendialog1.Execute) and (copy(opendialog1.FileName,2,2)=':\') then begin //...........2.......... for I:=1 to opendialog1.Files.Count do begin //..........3.......... J:=I; if J=opendialog1.Files.Count then J:=0; fname:=opendialog1.Files.Strings[J]; assignfile(infile,fname); reset(infile); while not Eof(infile) do begin //........4......... readln(infile,instring); with gtemp1 do begin if copy(instring,1,4)='0000' then gtemp1.employee_no:=copy(instring,5,4)--gtemp1是record类型数据 else gtemp1.employee_no:=copy(instring,4,5); gtemp1.g_date:=copy(instring,17,8); gtemp1.g_time:=copy(instring,25,2) copy(instring,27,2); gtemp1.text:=copy(instring,31,3); end; if gtemp1.text='P10' then begin if not dm.Table1.Locate('Employee_no;G_date;Text',vararrayof([gtemp1.employee_no,gtemp1.g_date,gtemp1.text]),[]) 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("' gtemp1.employee_no '","' gtemp1.g_date '","' gtemp1.g_time '","' gtemp1.text '")'); prepare; execsql; end; end; end; if gtemp1.text='P20' then begin //这里就是需要的代码 end; end; end; //........4........ closefile(infile); end; //........3........ end; //.........2......... end;
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-29 18:17:18 IP:203.69.xxx.xxx 未訂閱
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  sDataStringList: TStringList;
  i: Integer;
  sEmpNo: String;
begin
  if(opendialog1.Execute) and (copy(opendialog1.FileName,2,2)=':\') then
  begin //...........2..........
    sDataStringList := TStringList.Create;
    try
      for I:=0 to opendialog1.Files.Count-1 do
      begin //..........3..........
        sDataStringList.Clear;
        fname:=opendialog1.Files.Strings[I];
        assignfile(infile,fname);
        reset(infile);
        while not Eof(infile) do
        begin //........4.........
          readln(infile,instring);
          with gtemp1 do
          begin
            if copy(instring,1,4)='0000' then
              gtemp1.employee_no:=copy(instring,5,4)
            else
              gtemp1.employee_no:=copy(instring,4,5);
            gtemp1.g_date:=copy(instring,17,8);
            gtemp1.g_time:=copy(instring,25,2) copy(instring,27,2);
            gtemp1.text:=copy(instring,31,3);
          end;
          if gtemp1.text='P10' then
          begin
            if not dm.Table1.Locate('Employee_no;G_date;Text',vararrayof([gtemp1.employee_no,gtemp1.g_date,gtemp1.text]),[]) 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("' gtemp1.employee_no '","' gtemp1.g_date '","' gtemp1.g_time '","' gtemp1.text '")');
                prepare;
                execsql;
              end;
            end;
          end;
          if gtemp1.text='P20' then
          begin
            sDataStringList.Add(instring);
          end;
        end; //........4........
        closefile(infile);
        if (sDataStringList.Count>0) then
        begin
          sDataStringList.Sort;
          sEmpNo := LeftStr(sDataStringList[sDataStringList.Count-1],8);
          for i:=sDataStringList.Count-2 downto 0 do
          begin
            if sEmpNo=LeftStr(sDataStringList[i],8) then
              sDataStringList.Delete(i)
            else
              sEmpNo := LeftStr(sDataStringList[i],8);
          end;
        end;
        for i:=0 to sDataStringList.Count-1 do
        begin
          with gtemp1 do
          begin
            if copy(sDataStringList[i],1,4)='0000' then
              gtemp1.employee_no:=copy(sDataStringList[i],5,4)
            else
              gtemp1.employee_no:=copy(sDataStringList[i],4,5);
            gtemp1.g_date:=copy(sDataStringList[i],17,8);
            gtemp1.g_time:=copy(sDataStringList[i],25,2) copy(sDataStringList[i],27,2);
            gtemp1.text:=copy(sDataStringList[i],31,3);
          end;
          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("' gtemp1.employee_no '","' gtemp1.g_date '","' gtemp1.g_time '","' gtemp1.text '")');
            prepare;
            execsql;
          end;
        end;
      end; //........3........
    finally
      sDataStringList.Free;
    end;
  end;  //.........2.........
end;
發表人 - malanlk 於 2005/08/29 18:19:15
系統時間:2024-06-16 14:50:07
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!