请教TXT文档导入后无法排序(200)

  • 主题发起人 主题发起人 peoplexiao
  • 开始时间 开始时间
P

peoplexiao

Unregistered / Unconfirmed
GUEST, unregistred user!
请教用以下语句将TXT文档导入到SQL中后,顺序全部被打乱了 EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:/DT.txt -c -Sservername -Usa -Ppassword' 而TXT文档中又没有排序的项次,如何在导入的过程中,按文本的顺序导入到SQL中(或者导入后加入一个ITM的项次也行只要同文本文件内容的顺序一致),谢谢
 
换种方式导入即可。例如:加载文件后逐行插入表格,如果你的文件不大,建议试试。
 
加载文件后逐行插入表格----这句话怎么理解,能不能再详细一点,谢谢!
 
试试下面的2种方法:1、 if dlgOpendatain.Execute then begin datapath := dlgOpendatain.FileName; //取得文件路径 Filepath := ExtractFileName(datapath); //取得文件名 AssignFile(TeFile1, datapath); //将文件变量与文件关联 Reset(TeFile1); //以读写方式打开类型文件和无类型文件 try j := 0; while not Eof(TeFile1) do begin application.ProcessMessages; Readln(TeFile1, str); //一行一行的读文件,str为一行的字符串 recordstr := str; inc(j); i := 0; while pos(#9, recordstr) > 0 do //#9是tab分隔符 begin str := Copy(recordstr, 1, Pos(#9, recordstr) - 1); case i of 0:str1 := str; 1:str2 := str; end; i := i + 1; recordStr := copy(recordstr, (Pos(#9, recordstr) + 1), length(recordstr)); if i = 2 then str4 := trim(uppercase(recordStr)); end; ADOQuery1.Close;    ADOQuery1.SQL.Clear; ADOQuery1.SQL.TEXT:='INSERT INTO S1,S2,S3 VALUES('+''''+ str1''''+','+''''+str2+''''+','+''''+str3+''''+')'; ADOQuery1.Prepare; ADOQuery1.ExecSQL ; end; MessageBox(GetactiveWindow(), '当前导入数据完毕!', '提示', MB_OK + mb_iconexclamation); except CloseFile(TeFile1); end; end;2、按下面的方法,四万条记录全部导入ACCESS,直接从文本中装载23.90秒,当我将文本装载到MEMO1中的时候,八万条记录全部导入ACCESS也不过四十一秒。unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, Gauges, DB, ADODB, ComObj, ADOInt;type TStrArray = array[1..9] of string;type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; StatusBar1: TStatusBar; Gauge1: TGauge; ADOConnection: TADOConnection; Label1: TLabel; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1 : TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);const TabChar = #32; //定义空格键var i, j : integer; D1 : Real; TeFile1 : TextFile; datapath, Filepath, str: string; dd : TStrArray; AdoRecordSet : variant; FConnectionObject : _Connection;begin AdoRecordSet := CreateOleObject('ADODB.RecordSet'); ADOConnection.Connected := True; FConnectionObject := ADOConnection.ConnectionObject; AdoRecordSet.CursorLocation := clUseClient; AdoRecordSet.open('select * from abcdefg where 1=2', FConnectionObject, adOpenStatic, adLockOptimistic, AdCmdText); //写数据库 try OpenDialog1.Title := '请选择要打开的文件'; OpenDialog1.Filter := '数据文件(*.txt)|*.txt'; if OpenDialog1.Execute then begin DataPath := OpenDialog1.FileName; //取得文件路径 Filepath := ExtractFileName(DataPath); //取得文件名 // Memo1.Lines.Clear; // Memo1.Lines.LoadFromFile(DataPath); //.LoadFromStream(ms2); AssignFile(TeFile1, DataPath); //将文件变量与文件关联 Reset(TeFile1); //以读写方式打开类型文件和无类型文件 statusbar1.Panels[1].Text := FormatDateTime('hh:mm:ss', now()); //开始时间 //Gauge1.MaxValue:=Memo1.Lines.Count; D1 := Now; try // for i := 0 to Memo1.Lines.Count do while not Eof(TeFile1) do begin Application.ProcessMessages; Readln(TeFile1, str); //一行一行的读文件,str为一行的字符串 statusbar1.Panels[3].Text := str; //str := Memo1.Lines; j := 1; while pos(TabChar, str) > 0 do begin dd[j] := Copy(str, 1, pos(TabChar, str)); Delete(str, 1, Pos(TabChar, str) + 1); Str := TRIM(Str); Inc(j); end; DD[9] := str; AdoRecordSet.AddNew; try AdoRecordSet.fields[1].value := DD[1]; AdoRecordSet.fields[2].value := DD[2]; AdoRecordSet.fields[3].value := DD[3]; AdoRecordSet.fields[4].value := DD[4]; AdoRecordSet.fields[5].value := DD[5]; AdoRecordSet.fields[6].value := DD[6]; AdoRecordSet.fields[7].value := DD[7]; AdoRecordSet.fields[8].value := DD[8]; AdoRecordSet.fields[9].value := DD[9]; AdoRecordSet.Update; except end; Inc(i); //Gauge1.Progress:=Gauge1.Progress + 1; Label1.Caption:=IntToStr(i); end; statusbar1.Panels[2].Text := FormatDateTime('hh:mm:ss', now()); //结束时间 statusbar1.Panels[0].Text := '总用时: ' + Floattostr((NOW - D1) * 24 * 60 * 60); MessageBox(GetactiveWindow(), '当前导入数据完毕!', '提示', MB_OK + mb_iconexclamation); except CloseFile(TeFile1); end; end; finally AdoRecordSet.Close; end;end;procedure TForm1.FormCreate(Sender: TObject);var //联接ACCESS数据库的方法。 path : string;begin path := ExtractFilePath(Application.ExeName); //程序路径 if path[Length(path)] <> '/' then path := path + '/'; ADOConnection.Connected := False; try ADOConnection.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + path + 'Data.MDB' + ';Persist Security Info=False'; ADOConnection.Connected := true; except MessageBox(GetActiveWindow(), '系统错误!', '警告', MB_OK + MB_ICONWARNING); application.Terminate; end;end;end.
 
用了方案1,j值好像在方案一中未起作用
 
程式修改如下:procedure TForm1.BitBtn1Click(Sender: TObject); var str,datapath,filepath,recordstr:string; tefile1:textfile; j,i:integer; str1,str2,str3,str4:string; str5,str6,str7,str8:string; str9,str10,str11,str12:string;begin if opendialog1.Execute then begin datapath:=opendialog1.filename; filepath:=extractfilename(datapath); assignfile(tefile1,datapath); reset(tefile1); try j:=0; while not eof(tefile1) do begin application.ProcessMessages; readln(tefile1,str); recordstr:=str; inc(j); i:=0; while pos(#9,recordstr)>0 do begin str:=copy(recordstr,1,pos(#9,recordstr)-1); case i of 0:str1:=str; 1:str2:=str; 2:str3:=str; 3:str4:=str; 4:str5:=str; 5:str6:=str; 6:str7:=str; 7:str8:=str; 8:str9:=str; 9:str10:=str; 10:str11:=str; end; i:=i+1; recordstr:=copy(recordstr,(pos(#9,recordstr)+1),length(recordstr)); if i=11 then str12:=trim(uppercase(recordstr)); end; adoquery1.Close; adoquery1.SQL.Clear; adoquery1.SQL.Text:='insert into qh(name,time,up,qty,opi_dif,qty_in,qty_off,up_ave,up_buy,up_sell,opi,BSPK) values('+''''+str1+''''+','+''''+str2+''''+','+''''+str3+''''+','; adoquery1.SQL.Text:=adoquery1.SQL.Text +''+''''+str4+''''+','+''''+str5+''''+','+''''+str6+''''+','+''''+str7+''''+','+''''+str8+''''+','+''''+str9+''''+','; adoquery1.SQL.Text:=adoquery1.SQL.Text +''+''''+str10+''''+','+''''+str11+''''+','+''''+str12+''''+')'; adoquery1.Prepared; adoquery1.ExecSQL; end; messagebox(getactivewindow(),'当前数据导入完毕!','提示',MB_OK+mb_iconexclamation); except closefile(tefile1); end;end;end;
 
执行是可以导入,但每次导入的顺序都不一样,望指教,谢谢!
 
你要检查你的表是否有什么自动排序的字段或者其它的设置,如果你的文本文件排序无误的话,你加载到memo后的顺序肯定是不会变的,这点你可以测试的(先把文件加载到memo中看看),那么你根据memo的行数循环插入表中(即逐行插入)后,记录的顺序是不该变的,实在不行,你在表里加一个序号字段,插入memo的行号看看,这样就可以保持一致了,再有问题就一定是其它的问题了,祝你好运。
 
同一个文档,第一次导入,同第二次导入的顺序会不一样,第一次导入时第一笔资料在第一行,第二次导入这个文档时第一笔资料在第三行了,不知道怎么回事!程式如下:procedure TForm1.BitBtn1Click(Sender: TObject); var str,datapath,filepath,recordstr:string; tefile1:textfile; j,i:integer; str1,str2,str3,str4:string; str5,str6,str7,str8:string; str9,str10,str11,str12:string;begin if opendialog1.Execute then begin datapath:=opendialog1.filename; filepath:=extractfilename(datapath); assignfile(tefile1,datapath); reset(tefile1); try j:=0; while not eof(tefile1) do begin application.ProcessMessages; readln(tefile1,str); recordstr:=str; inc(j); i:=0; while pos(#9,recordstr)>0 do begin str:=copy(recordstr,1,pos(#9,recordstr)-1); case i of 0:str1:=str; 1:str2:=str; 2:str3:=str; 3:str4:=str; 4:str5:=str; 5:str6:=str; 6:str7:=str; 7:str8:=str; 8:str9:=str; 9:str10:=str; 10:str11:=str; end; i:=i+1; recordstr:=copy(recordstr,(pos(#9,recordstr)+1),length(recordstr)); if i=11 then str12:=trim(uppercase(recordstr)); end; adoquery1.Close; adoquery1.SQL.Clear; adoquery1.SQL.Text:='insert into qh(name,time,up,qty,opi_dif,qty_in,qty_off,up_ave,up_buy,up_sell,opi,BSPK) values('+''''+str1+''''+','+''''+str2+''''+','+''''+str3+''''+','; adoquery1.SQL.Text:=adoquery1.SQL.Text +''+''''+str4+''''+','+''''+str5+''''+','+''''+str6+''''+','+''''+str7+''''+','+''''+str8+''''+','+''''+str9+''''+','; adoquery1.SQL.Text:=adoquery1.SQL.Text +''+''''+str10+''''+','+''''+str11+''''+','+''''+str12+''''+')'; adoquery1.Prepared; adoquery1.ExecSQL; end; messagebox(getactivewindow(),'当前数据导入完毕!','提示',MB_OK+mb_iconexclamation); except closefile(tefile1); end;end;end;
 
每次导入前先把表清空,然后把文件先加载到memo中看看顺序,最后根据memo的行数循环导入表中,按照上述流程如果还有问题,把你的文本文件发出来看看。
 
第一次导入结果为名 称 时 间 最新价 数量 差数 入数 出数 均价 买价 卖价 库存量 提示aa 20091214-15:00 15725 20 4 12 8 15715 15725 15730 189070 备料生产aa 20091214-15:00 15730 10 0 5 5 15715 15730 15735 189038 备料生产aa 20091214-15:00 15725 2 0 1 1 15715 15725 15735 189070 备料生产aa 20091214-15:00 15725 28 0 14 14 15715 15725 15735 189070 备料生产aa 20091214-15:00 15725 18 0 9 9 15715 15730 15735 189070 备料生产aa 20091214-15:00 15725 14 0 7 7 15715 15725 15735 189070 备料生产aa 20091214-15:00 15725 44 28 36 8 15715 15730 15735 189066 备料生产
 
第二次导出结果为aa 20091214-15:00 15725 44 28 36 8 15715 15730 15735 189066 备料生产aa 20091214-15:00 15725 2 0 1 1 15715 15725 15735 189070 备料生产aa 20091214-15:00 15730 10 0 5 5 15715 15730 15735 189038 备料生产名 称 时 间 最新价 数量 差数 入数 出数 均价 买价 卖价 库存量 提示aa 20091214-15:00 15725 28 0 14 14 15715 15725 15735 189070 备料生产aa 20091214-15:00 15725 18 0 9 9 15715 15730 15735 189070 备料生产aa 20091214-15:00 15725 14 0 7 7 15715 15725 15735 189070 备料生产aa 20091214-15:00 15725 20 4 12 8 15715 15725 15730 189070 备料生产
 
导入之前把表清空,感觉好像打开文档时定位不到第一条
 
需导入的文本内容如下全部都是一行一行的,连标题共计八行,最后一列的后面还有一个tab名 称 时 间 最新价 数量 差数 入数 出数 均价 买价 卖价 库存量 提示 aa 20091214-15:00 15725 2 0 1 1 15715 15725 15735 189070 备料生产 aa 20091214-15:00 15725 28 0 14 14 15715 15725 15735 189070 备料生产 aa 20091214-15:00 15725 18 0 9 9 15715 15730 15735 189070 备料生产 aa 20091214-15:00 15725 14 0 7 7 15715 15725 15735 189070 备料生产 aa 20091214-15:00 15725 20 4 12 8 15715 15725 15730 189070 备料生产 aa 20091214-15:00 15725 44 28 36 8 15715 15730 15735 189066 备料生产 aa 20091214-15:00 15730 10 0 5 5 15715 15730 15735 189038 备料生产
 
复制到TXT文档中就同原文档一致了
 
把文件先加载到memo中顺序也是没有问题,根据memo的行数循环导入表中也是没有问题,开始导几次没有问题,后面又出现问题,现在在测试在表中加一个序号字段,看有没有问题
 
搞定了,在表中加入一个ITM字段,导进去是一条一条导入,同时写入ITM,谢谢!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部