最近接到一个小项目,主要是帮助移动公司的客户做数据处理,现在的情况是这样的。该客户要从不同的数据源取出不同的数据,整合到Excel中,然后进行数据处理,上报给领导。
1,用亿阳,中兴等公司的软件,取出不同的数据,但是他们只能保存为文本文件,及其变态。例如数据2,000是数值型。不用.要用,!!!
2,FTP登录,获得文本文件作为数据源之一
3,Telnet登录数据库,输入查询命令,查询得到最后结果
所有的数据都只能保存一天。
我现在要做的事情就是把这些数据整合起来,然后封装业务逻辑,生成报表,改善客户的工作质量,提高办事效率。听客户说她用手工的方式已经弄了三年了。当初我以为可以直接和数据库打交道,没有想到现在就是这样的状况,看来有垄断的地方,客户总是最倒霉的,这些所谓大公司提供给第三方公司开发的便利性=0。
写这篇文章主要就是做做笔记,因为这些自己从来没有做过,当初本来要做市场的,不知道怎么就到了写程序了,不过还好,自己兴趣还算比较广泛,自己也慢慢的爱上了这行!:)。
业务方面自己始终和客户保持着沟通,所以现在对自己来说,主要是技术方面的问题,因为同事结婚,自己这方面没有任何经验,所以只有上网google。
这里就只是讨论txt和access转换的问题,其实在Delphibbs中已经有很多这样的帖子了,都说得很清楚,我这里就结合实际的开发经历,来总结下技术特点。
- 拿到手中的文本格式如下。
湖北省(市、区)各地区各帐户状态用户数统计
子业务类型:所有用户(不分子业务 )
统计日期: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文件的处理