当前位置: 代码迷 >> 综合 >> Delphi7 电信行业中的数据处理 (一)txt文本和Access之间数据的转换
  详细解决方案

Delphi7 电信行业中的数据处理 (一)txt文本和Access之间数据的转换

热度:74   发布时间:2023-12-22 02:38:29.0

最近接到一个小项目,主要是帮助移动公司的客户做数据处理,现在的情况是这样的。该客户要从不同的数据源取出不同的数据,整合到Excel中,然后进行数据处理,上报给领导。

1,用亿阳,中兴等公司的软件,取出不同的数据,但是他们只能保存为文本文件,及其变态。例如数据2,000是数值型。不用.要用,!!!

2,FTP登录,获得文本文件作为数据源之一

3,Telnet登录数据库,输入查询命令,查询得到最后结果

所有的数据都只能保存一天。

我现在要做的事情就是把这些数据整合起来,然后封装业务逻辑,生成报表,改善客户的工作质量,提高办事效率。听客户说她用手工的方式已经弄了三年了。当初我以为可以直接和数据库打交道,没有想到现在就是这样的状况,看来有垄断的地方,客户总是最倒霉的,这些所谓大公司提供给第三方公司开发的便利性=0。

写这篇文章主要就是做做笔记,因为这些自己从来没有做过,当初本来要做市场的,不知道怎么就到了写程序了,不过还好,自己兴趣还算比较广泛,自己也慢慢的爱上了这行!:)。

业务方面自己始终和客户保持着沟通,所以现在对自己来说,主要是技术方面的问题,因为同事结婚,自己这方面没有任何经验,所以只有上网google。

这里就只是讨论txt和access转换的问题,其实在Delphibbs中已经有很多这样的帖子了,都说得很清楚,我这里就结合实际的开发经历,来总结下技术特点。

  1. 拿到手中的文本格式如下。

       湖北省(市、区)各地区各帐户状态用户数统计       

子业务类型:所有用户(不分子业务 )             

统计日期:2006-04-25              

地区 SCP号 用户模板 有效状态用户数 黑名单状态用户数 未头次使用状态用户数 挂失状态用户数 未头次使用挂失状态用户数            黑名单挂失状态用户数  有效用户数 两次以上充值用户数 开户用户数 零次充值用户数 余额为零有效状态用户数 余额非零有效状态用户数
--------------------------------- ------------ ----------------------------------- --------------------------- -------------------------------- -------------------------------- -------------------------------- --------------------------------------------------------------- - -------------------------------- -------------------------------- -------------------------------- -------------------------------- -------------------------------- ---------------------------------
武汉 421 神州行基本用户模板 1 0 0 0 0 0 1 1 1 0 0 1
武汉 421 神州行家园卡宜昌优惠 0 0 1 0 0 0 0 0 1 1 0 0
武汉 421 黄石PPS转IUSER模版 2 0 0 0 0 0 2 1 2 1 0 2
武汉 421 神州行家园卡武汉资费优惠 "2,933" 3 0 11 0 0 "2,701" "1,146" "2,947" "1,801" 240 "2,693"
武汉 421 武汉PPS开GPRS模板 "379,967" 245 "26,282" "2,334" 0 2 "315,987" "379,918" "408,830" "28,912" "29,546" "350,421"

这是一份纯文本文档,主要是用制表符来作为分隔符,在Delphi7种表示为#9,大家可以看到,里面的数值"29,546"又有双引号,又有,号,所以我第一步就是要规范数据:

首先把数据读入到Memo中,这时候用如下代码进行处理

          //文件规范操作
          strs:=TStringList.Create;
          strs.loadfromfile(OpenDialog1.FileName);  //载入文件
          strs.text:=stringreplace(strs.text,',','',[rfreplaceall]); //替换,注意这里'',里面是没有空格的
          strs.text:=stringreplace(strs.text,'"','',[rfreplaceall]); //替换"
          strs.savetofile(OpenDialog1.FileName);

          memo1.lines.loadfromfile(OpenDialog1.FileName);
          ProgressBar1.Max := strs.Count;

然后因为地区 SCP号 用户模板 有效状态用户数 黑名单状态用户数 未头次使用状态用户数 挂失状态用户数 未头次使用挂失状态用户数            黑名单挂失状态用户数  有效用户数 两次以上充值用户数 开户用户数 零次充值用户数 余额为零有效状态用户数 余额非零有效状态用户数
--------------------------------- ------------ ----------------------------------- --------------------------- -------------------------------- -------------------------------- -------------------------------- --------------------------------------------------------------- - -------------------------------- -------------------------------- -------------------------------- -------------------------------- -------------------------------- ---------------------------------
为无效数据,而且为固定格式,所以作如下处理

for i:=0 to strs.Count-1 do
          begin
              //Showmessage(intTostr(memo1.Lines.Count));
              //ShowMessage(Memo1.Lines.Strings[i]);
              //ShowMessage(Memo1.Lines[7-i]);
              Memo1.Lines.Delete(7-i);
              ProgressBar1.Position := ProgressBar1.Position + 1;
          end;

 

数据整理完毕后,然后开始入库,因为数据库现在为Access,有同事说要转为为excel,然后倒入,或者用数组来做,对于我这样的人来说,太麻烦了,在大富翁找到了比较简洁的办法,用sql语句,但是因为我这里的分隔符是用的制表符(制表符就是TAB,在delphi中用#9表示),而直接用sql语句是无法直接按照你想要的格式要求倒入,所以,就需要用到schema.ini文件来处理,但是在这个文件里面[a.txt]是固定的,无法能适应环境变化的要求,所以我写了一个iniFile文件,来动态的处理,主要是跟据你选择的文件来做的(openDialog1):

//处理schema.ini文件

Procedure TfrmImport.IniFile(filename:string);
var
   
MyIniFile: TIniFile;
    fName :string;
begin
  fName :=ExtractFilePath(Paramstr(0))+'Schema.ini';
  DeleteFile(fName);
  MyIniFile := TIniFile.Create(fName);

  //MyIniFile.WriteBool(StringReplace(ExtractFileName(OpenDialog1.FileName),ExtractFileExt(OpenDialog1.FileName),'',[]),'ColNameHeader',False);
 
MyIniFile.WriteString(filename,'ColNameHeader','False');
  MyIniFile.WriteString(filename,'Format','TabDelimited');
  MyIniFile.WriteInteger(filename,'MaxScanRows',0 );
  MyIniFile.WriteString(filename,'CharacterSet','OEM');
  MyIniFile.Free;

end;

================================================================

        IniFile(ExtractFileName(OpenDialog1.FileName));//处理schema.ini文件
        adoCoon.Connected:=false;

//这里事先先用select语句把表结构生成
        SQLStr:='insert into Alluser select * From [Text;Database='+ExtractFilePath(openDialog1.FileName)+';Format=TabDelimited].'+ExtractFileName(openDialog1.FileName);

//Format=TabDelimited表示分隔符的格式是制表符
        adoCoon.Execute(SQLStr);
        adoCoon.Connected:=true;

 

这样数据就可以完整地倒入到数据库中去了!

其中很多知识参看了Delphibbs的2005离线数据包,感谢Delphibbs,和来自其他网络的资料

 

资料参考:

www.delphibbs.com

知识点:

txt如何转换到access

如何替换文本中的,为空格

ini文件的处理

  相关解决方案