关于从TXT文档读取数据到table中 |
尚未結案
|
liangzai
初階會員 ![]() ![]() 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
请教各位前辈:
我要从一个存放员工上下班打卡时间的TXT文档中提取"下班打卡时间的最后一条记录",要怎样去做?
数据例如这样:
(1)
。。。。。。
000173820000254A20041214004500P20
000173820000254A20041214004500P20----P20代表打下班卡
000173820000254A20041214004500P20----取这一条
。。。。。。 或者这样:
(2)
。。。。。。
000173820000254A20041214004500P20
000173820000254A20041214004600P20
000173820000254A20041214004700P20----取这一条
。。。。。。 取相同员工号的下班打卡最晚的记录。
|
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
|
way888
初階會員 ![]() ![]() 發表:32 回覆:76 積分:36 註冊:2005-05-31 發送簡訊給我 |
|
liangzai
初階會員 ![]() ![]() 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
|
malanlk
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:20 回覆:694 積分:577 註冊:2004-04-19 發送簡訊給我 |
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 發送簡訊給我 |
|
liangzai
初階會員 ![]() ![]() 發表:77 回覆:91 積分:33 註冊:2004-08-13 發送簡訊給我 |
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 發送簡訊給我 |
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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |