如何将txt文件中特定格式的数据导入到数据库,处理后再导出(100分)

  • 主题发起人 主题发起人 johnnywong
  • 开始时间 开始时间
J

johnnywong

Unregistered / Unconfirmed
GUEST, unregistred user!
txt文件里的数据格式如下:
1到10位为:“用户编号”,11到50位为:“用户名称”,51到62位为:“交易类型”,63-70位为:“交易日期”(字段间没分割符号)
实际数据如下:

10810009梁锦吕 00120105327320080430
10810062伍玉云 00120101700120080430
10810109文良才 00120108835320080430
10810141张慧瑜 00120017287520080430
10810151周秀红 01920021234520080430
10810153卢燕清 00120100038320080430
10810165吴洪伦 01920031105020080430
10810207杨铨江 01920006698120080430
10810214李艳兰 01220100119120080430
10810215黄贵 02320014865620080430


请问如何将这些数据导入到数据库中,经过某些处理后再次导出到文本文件,导出格式分为两种:1:在纪录前面加序号,然后导出成没分割符号分割的数据格式;2:在纪录前面加序号,然后导出成用“|”作为分割符号分割的数据格式。
处理后需要的导出数据如下:
第一种格式:
1 10810009梁锦吕 00120105327320080430
2 10810062伍玉云 00120101700120080430
3 10810109文良才 00120108835320080430
4 10810141张慧瑜 00120017287520080430
5 10810151周秀红 01920021234520080430
6 10810153卢燕清 00120100038320080430
7 10810165吴洪伦 01920031105020080430
8 10810207杨铨江 01920006698120080430
9 10810214李艳兰 01220100119120080430
10 10810215黄贵 02320014865620080430

第二种格式:
1| 10810009|梁锦吕 |001201053273|20080430
2| 10810062|伍玉云 |001201017001|20080430
3| 10810109|文良才 |001201088353|20080430
4| 10810141|张慧瑜 |001200172875|20080430
..............


谢谢!
 
如果以前就是通过sql server的工具导出的可以随便导入,要不然自己写代码导入
 
如果是一次性操作,在Excel拼成sql语句就行了。
如果要写成代码,可以参考:
1. TList或TListBox等类的Loadfromfile方法装载
2. 进行循环 for i:=0 to List1.count-1 do 处理,追加进DataSet中
3. 对数据进行处理
4. 用DataSet或ClientDataSet打开处理好的数据,再用SaveXXXFile方法保存
不行的话,还是用TList类吧,也有SaveFile方法
 
数据要规范
procedure TForm1.btn1Click(Sender: TObject);
var
Opendia:TOpenDialog;
strlist:TStringList;
i:Integer;
begin
Opendia:=TOpenDialog.Create(nil);
Opendia.Filter:='(*.txt)|*.txt|(*.xls)|*.xls';

if Opendia.Execute then begin
FrmDM.con1.BeginTrans;
try begin
with FrmDM.qry1 do begin
close;
sql.Clear;
sql.Add('drop table barcode');
execsql;
end;
with FrmDM.qry1 do begin
close;
sql.Clear;
sql.Add('create table barcode(ID integer IDENTITY (1, 1),barcode varchar(20))');
execsql;
end;
{ FrmDM.con1.Execute('insert into barcode(barcode) select cstr(条码) From [Text;FMT=Delimited("");Database='+ExtractFilePath(Opendia.FileName)+'].'+ExtractFileName(Opendia.FileName)+'')}
if RightStr(Opendia.FileName,3)='txt' then begin
strlist:=tstringlist.Create;
strlist.LoadFromFile(Opendia.FileName);
for i:=0 to strlist.Count-1 do begin
with FrmDM.qry1 do begin
close;
sql.Clear;
sql.Add('insert into barcode(barcode) values('''+strlist+''')');
ExecSQL;
end;
end;
strlist.Free;
end
else
FrmDM.con1.Execute('insert into barcode(barcode) select cstr(条码) From [excel 8.0;Database='+opendia.FileName+'].[sheet1$]');
frmdm.con1.CommitTrans;
end;
except
Application.MessageBox('导入数据发生错误,请检查数据是否规范!','消息',16);
FrmDM.con1.RollbackTrans;
Exit;
end;
end;
if Opendia.FileName='' then Exit;
ShowMessage('导入完成!');
edt_file.Text:=Opendia.FileName;
Opendia.Free;

end;
 
{ FrmDM.con1.Execute('insert into barcode(barcode) select cstr(条码) From [Text;FMT=Delimited("");Database='+ExtractFilePath(Opendia.FileName)+'].'+ExtractFileName(Opendia.FileName)+'')}
是可以导的。效率因该比循环好。但是它需要数据是文本比如000011111 就成了1111了所以必须是“00000111” 用FMT=Delimited("");来指明 呵呵希望大家懂。自己做测试吧,共享下!
 
我现在就在处理类似的问题
方法有两种:
1。有列分隔符的,采用分隔符来处理,
2。固定列宽,列之间是多个空格补齐,这样的数据可以用COPY来处理,就是每一列有固定位数,
 
后退
顶部