http://blog.sina.com.cn/s/blog_6297de5e0101jiur.html

delphi实现批量读取格式有规律的文本文件的内容.

 (2014-05-14 14:33:34)
标签: 

教育

分类: delphi

现有一系统不定时在同一目录下生成一批txt文件,内容大概如下;

      20100112_164910,6,81406392,808,113,,

 

为方便统计,需要将这些txt文件中的数据读入数据表中.

现有两种方法:

   一是直接将数据读入到数据表中的某一列中,再用sql 语句拆开成几列: 

       20100112_164910   6     81406392      808         113

  二是在导入时就将其拆开成几列分别导入到各列中

 

如果第二种方法可以实现,那么对于系统的性能将会是一个很大的帮助.

下面介绍我的做法,可能是最笨重的一种,欢迎大家提出更好的方法.

 

   核心方法是调用memo的Delimiter特性. 若把Delimiter的值设为",",那么使用DelimitedText属性可得到由","分开的几行.

需要两个memo,第一个memo将文档中的内容读入,第二个memo将第一个memo中的内容分解成几行.

如上面的例子就会变成:

20100112_164910 

6

81406392

808

113

 

接下来的事情就变得比较简单了.当然这里面循环是肯定少不了的了.

下面是全部代码:

第一步:新建一个带参数的过程: 参数是文件名

var
    F:text; 

procedure TForm1.Insert(FileName:string);
var
  s: string;
  i:integer;
begin
  AssignFile(F,FileName); //将文件的内容读到F中
  Reset(F);
  Memo1.Clear;
  while not Eof(F) do
   begin
    Readln(F, s);       //再将F中的内容读到S中
    Memo1.Lines.Add(s); //将内容加入memo中
   end;
   CloseFile(F);

 

 if  memo1.Lines.Count>=1 then
 begin
   for i:=0 to memo1.Lines.Count-2 do
   begin
      if length(memo1.Lines[i])>4 then
      begin
      Memo2.Lines.Delimiter := ',';
      Memo2.Lines.DelimitedText := memo1.Lines[i];

 

       //下面两句是业务处理语句,把相关的内容插入表中
      self.ADOCommand1.CommandText:=' insert into lack_call (other1,rq,port,dhhm,gh,other2) values ('''+memo2.Lines[0]+''','''+memo2.Lines[1]+''','''+memo2.Lines[2]+''','''+memo2.Lines[3]+''','''+memo2.Lines[4]+''','''+memo2.Lines[5]+''')';
      self.ADOCommand1.Execute;

      end;
   end;
 end;
end;

 

第二步: 写好按钮代码,点击按钮实现插入操作:

 

procedure TForm1.Button1Click(Sender: TObject);
var
  sr: TSearchRec;     //定义 TSearchRec 结构变量
  Attr: Integer;      //文件属性
  s: string;          //要搜索的内容
//  List: TStringList;  //存放搜索结果

begin

  s := GetCurrentDir+'/'+ edit1.Text+'/*.txt';           //edit1.text是文件所在的文件夹,*.txt意为将所有的txt文件都处理一次
  Attr := faAnyFile;              //文件属性值faAnyFile表示是所有文件
  //List := TStringList.Create;     //List建立

  if FindFirst(s,Attr,sr)=0 then  //开始搜索,并给 sr 赋予信息, 返回0表示找到第一个
  begin
    repeat                        //如果有第一个就继续找
     // List.Add(sr.Name);          //用List记下结果
     Insert(GetCurrentDir+'/'+ edit1.Text+'/'+sr.Name);
    Windows.DeleteFile(PChar(GetCurrentDir+'/'+ edit1.Text+'/'+sr.Name));  //删除
    until(FindNext(sr)<>0);       //因为sr已经有了搜索信息, FindNext只要这一个参数, 返回0表示找到
  end;
  FindClose(sr);                  //需要结束搜索, 搜索是内含句柄的

 // ShowMessage(List.Text);         //显示搜索结果
 // List.Free;                      //释放List

end;

 

 上面代码能用delphi7.0 成功运行.