我现在要做一个程序,功能如下从文本文件中读取数据后插入到数据库中
文本文件的格式是
第一列是编码,第二列是性别,第三列是名称,但是文本文件本身不包含列名,只有具体的内容。0001   男    AAA
0002   女    BBB
0003   女    CCC列和列之间是用TAB键分隔,行与行之间是用回车键分隔,
领导要求我点击一个按钮就要把它插入到数据库中。
这怎么实现啊?
请高人指点一下。跪地感谢!

解决方案 »

  1.   

    如果文本文件本身有分隔符就简单了啊。为什么非要用tab啊。还要先处理加上分隔符比如逗号,然后直接用SQL语句导入到数据库。
      

  2.   

    三列是插入到不同的字段中,客户提供的txt是通过以前的老程序导出的,他们不可能换成其他分隔符,因为
    数据量很大。我想知道在deiphi中如何能判断一个txt文档中是否有tab键
      

  3.   

    你把TAB看成空格.一个TAB就是八个空格.
      

  4.   

    你看看SQL的
    BULK INSERT语句,一个SQL语句就可以导入到数据库表里。如果需要例子,留下邮箱
      

  5.   

    大家都不错呀,char(9)就是tab键了,先读到一个string变量中,再分析吧,
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;
      

  7.   

    procedure TForm1.BitBtn1Click(Sender: TObject);
    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;
      

  8.   

    请参考:在Form上放一个ADOConnection,连结指向目标Access库比如txt文件在c:\temp\aaaa.txt
    就执行
    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')
      

  9.   

    还有一个办法,
    遍历文件,把TAB替换成','
    然后用ADO控件,设置连接字符串为
    Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\;Extensions=asc,csv,tab,txt;Persist Security Info=False;
    然后用"select * from aaa.csv"来访问
      

  10.   

    呵呵,刚才没注意
    hqhhh(枫叶)已经说过了
      

  11.   

    用TStringlist把文件读出来,再取每一行用POS('        ',每行的字符串)来区分不就行了。
      

  12.   

    procedure TForm1.Button1Click(Sender: TObject);
    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;自己测试调整
      

  13.   

    别人动嘴,我动手
    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.
      

  14.   

    Const TAB=#9;                       //定义常量作为间隔字符Procedure TFormSelUUT.LoadTestRecord(UUTName,TbName,LoadFileName : String);
    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;
      

  15.   

    分割最简单的方法就是使用Split0这个函数,包含在XMLUtil单元内。
    它返回是一个TStringList,内面就是分割好的东西