关于文本数据读取后导入数据库的问题
我有如下类似数据,规则如下:
1、每个单位的记录的起始位置(即第一行)用'================'标明
2、第二行为邮编等信息
3、第三行单位名称等信息
4、第四行要取的信息为单位地址等
5、第五行开始以'----------------'为标志是清单记录开始(记录条数因各单位而不定)
直到:再次出现'======================='表明另外一个单位的数据开始
6、其中每一行中的数据再以'$'符为字段分隔符,并且是定长的
=========================================================================================
1092365482342585861289NHMD16836573751030200500002$00001 $07207 $510001$ //取邮编
1092365482342585861289NHMD16836573759040**市***大厦**栋*楼***座 //取地址
1092365482342585861289NHMD16836573759050**市***有限公司 //取单位名称
1092365482342585861289NHMD16836573759070-------------------------------------------------
//该单位的清单开始(清单数目因各单位实际而不同,字段以$符分隔,且字段定长)(要取各字段)
1092365482342585861289NHMD16836573759100090713$TH01000801$ $ $ 172,000.00$
1092365482342585861289NHMD16836573759120090717$8632000419$ $ 8,000.00$ $
=========================================================================================
//下一单位的数据由此开始(即'====='是单位间隔标志符)
问各位大侠:如何做才好?
我有如下类似数据,规则如下:
1、每个单位的记录的起始位置(即第一行)用'================'标明
2、第二行为邮编等信息
3、第三行单位名称等信息
4、第四行要取的信息为单位地址等
5、第五行开始以'----------------'为标志是清单记录开始(记录条数因各单位而不定)
直到:再次出现'======================='表明另外一个单位的数据开始
6、其中每一行中的数据再以'$'符为字段分隔符,并且是定长的
=========================================================================================
1092365482342585861289NHMD16836573751030200500002$00001 $07207 $510001$ //取邮编
1092365482342585861289NHMD16836573759040**市***大厦**栋*楼***座 //取地址
1092365482342585861289NHMD16836573759050**市***有限公司 //取单位名称
1092365482342585861289NHMD16836573759070-------------------------------------------------
//该单位的清单开始(清单数目因各单位实际而不同,字段以$符分隔,且字段定长)(要取各字段)
1092365482342585861289NHMD16836573759100090713$TH01000801$ $ $ 172,000.00$
1092365482342585861289NHMD16836573759120090717$8632000419$ $ 8,000.00$ $
=========================================================================================
//下一单位的数据由此开始(即'====='是单位间隔标志符)
问各位大侠:如何做才好?
1092365482342585861289NHMD16836573751030200500002$00001$07207$510001$ //取邮编
1092365482342585861289NHMD16836573759040**市***大厦**栋*楼***座 //取地址
1092365482342585861289NHMD16836573759050**市***有限公司 //取单位名称
1092365482342585861289NHMD16836573759070--------------------------------------
//该单位的清单开始(清单数目因各单位实际而不同,字段以$符分隔,且字段定长)(要取各字段)
1092365482342585861289NHMD16836573759100090713$TH01000801$ $ $ 172,000.00$
1092365482342585861289NHMD16836573759120090717$8632000419$ $ 8,000.00$ $
==============================================================================
//下一单位的数据由此开始(即'====='是单位间隔标志符)
一个一个字符的分析
一句一句的INSERT
将整个文本文件读入到一个数组变量($file)中,而文本文件里边的每行字符串可以作为数组的一个元素直接访问(比如$file[0]就是文本文件的第一行字符串)。最关键的还是每个数组元素的变量可以再次以分割符来切分,最后将切分的结果循环插入数据库。
小弟因工作需要刚接触delphi,不知道是否可以实现类似的功能,向大侠们求助!
有什么好的方法或者好的函数介绍,请告知,谢谢!
delphi中字符串本身就是一个数组,每一个字符为一个单元,既然数据都是定长的,可通过分析找出个字段的下标规律,只是不知道该文件有多大
像TStringList之类的能不能像数组那样方便操作?主要是可不可以将读入的整个文本的单行字串再进行部分截取操作?
或者读入到memo里可不可以实现这样的操作呢?
读出一行后,可以把读出的字符串进行分解,存入到数组或TStringList中去,再往表中导即可
--------------------------------------------------
这个就跟我的想法相一致了
不过要真是对于每一行都要做到一个字符一个字符来分析就麻烦了
有没有读取定长的函数或方法?
因为在清单的行中是规则的以';'为分隔并且字符串是定长的
如果可以的话,在读的过程中,把每天记录合并放到一起中间加个分隔符
再倒数据库里面去
处理文本 其实用ultraedit 更方便 先把格式处理好,倒就方便
有没有读取定长的函数或方法?用copy就行了,只要你的数据长度统一
然后在每行的特定位置截取所要的字符串(赋值给变量),但是插入数据库的时候却老是出错
不知为何(就是不知如何将该变量传给sql语句)
请问该如何作数据库的插入操作?
s:TStringList; s := TStringList.Create();
s.LoadFromFile('d:\a_.txt');
yb_a := copy(s.Strings[i+2],75,6);
addr_a := copy(s.Strings[i+3],41,60);如下语句出错:
query1.SQL.Clear;
query1.SQL.Add('insert into tab_test values(:yb_a,:addr_a,:dw_a,:zh_a)')
ParamByName('yb_a').AsString := yb_a;
ParamByName('addr_a').AsString := addr_a;
ParamByName('dw_a').AsString := dw_a;
ParamByName('zh_a').AsString := zh_a;
ExecSQL;改成:table1.Fields[0].AsString := yb_a;(用ttable控件来做插入一样会出错)我再改用adoTable控件来做,还是出错。没撤了.....
ADOTable1.Insert;
ADOTable1['yb']:=yb_a;
ADOTABLE1['txaddr']:=addr_a;
ADOTable1.Post;
ADOTable1.next;注:tab_test为vfp建立的数据表哪位有经验的大哥给说说吧,我愿意另外开帖给分,谢谢!
实在是烦闷极了....
提示的错误是:Table1:Dataset not in Edit or Insert Mode我是刚接触delphi的超级菜鸟,如果那位大哥大姐能够好心指出我所犯的错误,或者能够用方法解决我遇到的问题,非常感谢!
郁闷着...
var
s:TStringList;
str:string; nPos:integer;
i:integer;
begin
s := TStringList.Create();
s.LoadFromFile('d:\a_.txt');
for i:=0 to s.count-1 do
begin
if copy(s.Strings[i],41,1) = '=' then
begin
if copy(s.Strings[i+2],38,2) = '03' then
begin
bz := copy(s.Strings[i+2],71,3);
Label1.Caption := bz;
//str := copy('小素',1,2);
yb_a := copy(s.Strings[i+2],75,6);
addr_a := copy(s.Strings[i+3],41,60);
dw_a := copy(s.Strings[i+4],41,40);
zh_a := copy(s.Strings[i+5],41,18);
//
begin
Label2.Caption := yb_a; //程序到此位置还是正常的,一旦涉及下面的插入操作就出问题了
table1.Fields[0].AsString := yb_a;
end;
end;
//if copy(s.Strings[i+8],39,1) = '9' then
//for j:=0 to strtoint(copy(s.Strings[i+j+1],38,2)) do end;
end;
//s.free;
end;
var
s:TStringList;
str:string;
bz,yb_a,addr_a,dw_a,zh_a:string;
begin
s := TStringList.Create();
s.LoadFromFile('d:\a_.txt');
bz := copy(s.Strings[i+2],71,3);
yb_a := copy(s.Strings[i+2],75,6);
addr_a := copy(s.Strings[i+3],41,60);
dw_a := copy(s.Strings[i+4],41,40);
zh_a := copy(s.Strings[i+5],41,18); //这些变量均正常能取值 begin
Label2.Caption := yb_a;
table1.Fields[0].AsString := yb_a;(问题将从这开始....)
end;
end;
j:integer;
with Table1 do
begin
Open;
for j:=1 to 4 do
begin
Append; //插数据前别忘了
table1.fields[j-1].AsString := yb_a; //测试yb_a是否能顺利插入
post;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
Table1.Active := true;//运行时要激活Table的Active属性
end;