我现在要做一个程序,功能如下从文本文件中读取数据后插入到数据库中
文本文件的格式是
第一列是编码,第二列是性别,第三列是名称,但是文本文件本身不包含列名,只有具体的内容。0001 男 AAA
0002 女 BBB
0003 女 CCC列和列之间是用TAB键分隔,行与行之间是用回车键分隔,
领导要求我点击一个按钮就要把它插入到数据库中。
这怎么实现啊?
请高人指点一下。跪地感谢!
文本文件的格式是
第一列是编码,第二列是性别,第三列是名称,但是文本文件本身不包含列名,只有具体的内容。0001 男 AAA
0002 女 BBB
0003 女 CCC列和列之间是用TAB键分隔,行与行之间是用回车键分隔,
领导要求我点击一个按钮就要把它插入到数据库中。
这怎么实现啊?
请高人指点一下。跪地感谢!
解决方案 »
- Field XXX cannot be modified
- 查看工程的Options报错
- 请问如何用Ado新建一张表然后存储存到SQL Server中的一个数据库中去!
- 关于dbexpress设置,急死人,在线等.......
- 在线求助,delphi的图书网站,马上给分。100分。
- 用SENDMESSAGE一窗口向另一窗口发送记录数据
- 过程的调用
- 数据库引擎错误(BDE)
- csdn论坛中三角和星的个数是怎么评定的啊?
- 一个奇怪而又难以解决的问题,连我们开发部英俊的组长都没办法哟!!!解决者给巨额高分
- 一个关于intallshield for delphi7的问题(在线等)
- Rave Report 的问题。。请进。。。
数据量很大。我想知道在deiphi中如何能判断一个txt文档中是否有tab键
BULK INSERT语句,一个SQL语句就可以导入到数据库表里。如果需要例子,留下邮箱
var
slData : TStringList;
i,j,iFieldIndex : Integer;
sLine,sValue,sSQL : string;
begin
slData := TStringList.Create;
try
//读取文本文件
slData.LoadFromFile('c:\aaa.txt');
for i:=0 to slData.Count-1 do
begin
//读取第i行
sLine := slData.Text;
sSQL := 'insert into 表1 (字段1,字段2,......) Values ( ';
iFieldIndex := 0;
sValue := '';
//分析每一行
for j:=1 to Length(sLine) do
begin
//如果出现TAB
if sLine[j]=#9 then
begin
Inc(iFieldIndex);
//读取一个字段
sSQL := sSQL+sValue+',';
sValue :='';
end;
sValue := sValue+sLine[j];
end;
//会多一个','
sSQL := Copy(sSQL,1,Length(sSQL)-1);
sSQL := sSQL+')';
//在数据库执行 sSQL 写入数据
........ end;
finally
FreeAndNil(slData);
end;
end;
var
F:textFile;
I:integer;
S:string;
begin AssignFile(F,'C:\dd.txt');
Reset(F);
I:=1;
while not eof(F) do
begin
readln(F,s);
self.StringGrid1.Rows[I].Delimiter:=chr(9);
self.StringGrid1.Rows[I].DelimitedText:=s;
inc(I);
end;
closeFile(F);
end;
就执行
ADOConnection.Connected := True;
ADOConnection.Execute('Select * Into abcd From [Text;Database=c:\temp].aaaa.txt');txt导入SQLServer
select * from OpenRowset('MSDASQL', 'Driver={Microsoft Text Driver (*.txt; *.csv)};
DefaultDir=c:\temp;','select * from aaaa.txt')
遍历文件,把TAB替换成','
然后用ADO控件,设置连接字符串为
Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\;Extensions=asc,csv,tab,txt;Persist Security Info=False;
然后用"select * from aaa.csv"来访问
hqhhh(枫叶)已经说过了
var
sl,sl1: tstringlist;
i: integer;
begin
sl := tstringlist.Create;
sl1 := tstringlist.create;
sl.LoadFromFile('f:\test.txt');
for i:=0 to sl.Count-1 do
begin
sl1.Delimiter := chr(9);
sl1.DelimitedText := sl[i];
showmessage(sl1[0]+#13#10+sl1[1]+#13#10+sl1[2]);
end;
sl1.Free;
sl.Free;
end;自己测试调整
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB;type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
ADOQuery1: TADOQuery;
procedure Button1Click(Sender: TObject);
private
function CutStr(var Str:String):String;
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var TxtFile:TextFile;
str1,str2,str3:string;
tempstr:string;
begin
AssignFile(TxtFile,'新建文本文档 (2).txt');
Reset(TxtFile);
While not Eof(TxtFile) do
begin
Readln(TxtFile,tempstr);
str1:=CutStr(tempstr);
str2:=CutStr(tempStr);
str3:=tempStr;
ADOQuery1.Append;
ADOQuery1.FieldByName('field1').AsString:=str1;//存入第一个字段,field1,filed2,field3是你的字段名
ADOQuery1.FieldByName('field2').AsString:=str2;//存和第二个字段
ADOQuery1.FieldByName('field3').AsString:=str3;//存入第三个字段
ADOQuery1.Post;
end;
end;function TForm1.CutStr(var Str: String): String;
begin
Result:=Copy(Str,1,Pos(#9,Str)-1);
Str:=Copy(Str,Pos(#9,Str)+1,MaxInt);
end;end.
var
hF : TextFile;
CurRecord : String;
bTextFail : bool;
TName,Value,Resu : String;
Position : Integer;
begin
bTextFail := false; AssignFile(hF, LoadFileName);
Reset(hF);
FormSelUUT.ADOTable1.TableName := TbName; FormSelUUT.ADOTable1.Open;
FormSelUUT.ADOTable1.First; Readln(hF,UUTName);
Readln(hF,TabelName);
Readln(hF,TesterName);
Readln(hF,Today);
Readln(hF,ThisTime);
Readln(hF,CurRecord);
repeat
begin
Readln(hF,CurRecord);
Position := Pos(TAB,CurRecord);
TName := Copy(CurRecord,0,Position-1); Delete(CurRecord,1,Position);
Position := Pos(TAB,CurRecord);
Value := Copy(CurRecord,0,Position-1); Delete(CurRecord,1,Position);
Position := Pos(TAB,CurRecord);
Resu := Copy(CurRecord,0,Position-1); if((CurRecord = '####')) then
bTextFail := true; if(TName = FormSelUUT.ADOTable1.FieldByName('TestNo').AsString) then
begin
FormSelUUT.ADOTable1.Edit;
FormSelUUT.ADOTable1.FieldByName('GetValue').AsString := Value;
FormSelUUT.ADOTable1.FieldByName('TestResult').AsString := Resu;
FormSelUUT.ADOTable1.Post;
end;
FormSelUUT.ADOTable1.Next;
end;
until(FormSelUUT.ADOTable1.Eof or bTextFail); FormSelUUT.ADOTable1.Close;
Closefile(hF);end;
它返回是一个TStringList,内面就是分割好的东西