时间:2021-07-01 10:21:17 帮助过:11人阅读
《万能数据库查询分析器》实现使用SQL语句直接高效地訪问文本文件
马根峰
(广东联合电子服务股份有限公司, 广州 510300)
摘要 用SQL语句来直接訪问文本文件?是在做梦吗?
本文具体地介绍了“万能数据库查询分析器”,中文版本号《DB 查询分析器》、英文版本号《DB Query Analyzer》在 文本文件处理方面很强大的功能,你能够直接用SQL语句来訪问这些文本文件,訪问250万条记录的文件的复杂的关联操作,也只是用时59秒钟。须要注意的是,文本文件的第一行须要有列名。
关键词 DB 查询分析器;DB Query Analyzer
1 引言
中国本土程序猿马根峰推出的个人作品----万能数据库查询分析器,中文版本号《DB 查询分析器》、英文版本号《DB Query Analyzer》。
万能数据库查询分析器集哈希技术、链表等多种数据结构于一体。使用先进系统开发技术,经历4年的研究、开发、測试周期后在2006年面世。
之后7年来一直在进行不断地完好、升级,到眼下为止。最新版本号为5.04 。“万能数据库查询分析器”核心部分就具有长达5万多行代码的工作量,使得其具有强大的功能、友好的操作界面、良好的操作性、跨越各种数据库平台乃至于EXCEL和文本文件。
你能够通过它查询ODBC数据源(包含世面上全部的数据库、TXT/CSV文件、EXCEL文件)的数据。你能够同一时候运行多条DML语句乃至存贮过程。结果会以你设定的表格、文本框、文件来返回。从数据库导出千万条数据时,效率与DBMS没有什么差别。
本文将以5.04版本号为例,具体阐述“万能数据库查询分析器”中文版本号《DB 查询分析器》在 文本文件 处理方面很强大的功能,你能够直接用SQL语句来訪问这些文本文件,訪问250万条记录的文件的复杂的关联操作,也只是用时59秒钟。要注意的是,文本文件的第一行须要有列名。
2 产品获得的成就及发展历程
中文版本号《DB 查询分析器》在中关村在线 下载量超过10万 多次,位居整个数据库类排行榜中前20位。
在《程序猿》2007第2期的“新产品&工具点评”部分,编辑“特别推荐”了“万能数据库查询分析器”公布。本期仅仅点评了5个工具。各自是“Adobe Acrobat 8 中文版”、“迅雷搜索 1.7 新版上线”、“Google 桌面搜索 5.0 中文公布”、“BEA 公布 WebLogic SIPServer 3.0”和特别推荐“万能数据库查询分析器”公布。前面4个都是国内外大型软件公司的产品,仅仅有“万能数据库查询分析器”是个人创作的软件。
截止到2013年4月17日,在Baidu上搜索keyword"万能数据库查询分析器",搜索结果达318万。在Baidu上搜索keyword"DB查询分析器"、"DBQuery Analyzer",搜索结果分别在104万、16万左右。在Google上搜索“DB 查询分析器”、“DBQuery Analyzer”。结果分别达104万、44万之多。
本人撰写了关于“万能数据库查询分析器”有关技术的64篇文章,公布在《电脑编程技巧与维护》、《软件》、《计算机时代》、《电脑编程技巧与维护》、百度文库、CSDN资源、和本人的四大博客上(CSDN博客、新浪博客、QQ空间和搜狐博客上)。
3 为何用《DB 查询分析器》来訪问文本文件来解决实际问题
在广东联合电子服务股份有限公司实施一张网的过程中,因为路段上传的流水存在大量的异常,导致依照正常的结算流程无法快速地进行路段的结算。
因此,为了进行及时的结算,广东省快速公路公司授权先将异常流水进行忽略。后期再将这些流水进行上传、改动、拆分结算。
近期,为了实施忽略流水的回传。本人做的第一步就是从忽略的流水中依照(流水仅仅有在管理点存在、中心和管理点都存在)这两种情况。再依照流水金额小于0、等于0、大于0三类进行统计成台账(6个文件),然后业务组,再从这些分类批次(6个文件)中确认哪些批次须要回传(形成2 个文件。 流水大于0.csv 和 流水小于0.csv )。
最终,本人还要依据这些这两个文件里是否“回传”,再从结算系统中依据复杂的逻辑,找出要回传的流水号并依照区域分成4个文件。
在本次处理中,
源处理文件:流水大于0.csv 、 流水小于0.csv 、tb_road、 管理点存在中心不存在的流水_全部.txt 和 管理点与中心都存在的部分_全部.txt 这5个文件。
后两个文件是从结算系统数据库server中通过复杂的逻辑处理生成的中间结果文件。
输出结果:要回传的流水号并依照区域分成4个文件。
解决方式:因此,输入条件决定要么在结算数据库系统中建立 数据表 来完毕条件的推断;要么将结果全部忽略的流水、须要关联的数据表(tb_road)导出成.CSV/.TXT 文件,再使用《DB 查询分析器》强大、高效的.CSV/.TXT 訪问功能来实施整个回传流水文件的生成。
tb_road 表仅仅是从生产机数据库中导出tb_road表即可了。
图2 数据挖掘生成文本文件“管理点与中心都存在部分_全部.txt”
4 5.04中文版本号《DB 查询分析器》为例
下面我们就以“万能数据库查询分析器”的中文版本号《DB 查询分析器》 5.04为例,以Windows 2000Server操作系统为平台,先创建基于文件夹 “D:\ODBC_TXT_CSV”中 .TXT/.CSV 文件的ODBC数据源 “odbc_txt_csv”,然后再通过 DB 查询分析器 5.04来訪问这些文件夹下的文件。
操作系统: Windows2000 Server操作系统
CPU:2.8 GHZ 单核
内存:1GB
前台程序: DB 查询分析器 5.04
后台文件: .TXT/.CSV
图3 创建基于 .CSV/.TXT 文件的ODBC数据源(一)
图4 创建基于 .CSV/.TXT 文件的ODBC数据源(二)
图5 登录odbc_txt_csv。不用输入username和口令
图6 对象浏览器来查看数据源 odbc_txt_csv
图7 Windows资源管理器中,ODBC数据源odbc_txt_csv相应的文件夹下全部的文件
图8 用SQL语句来訪问 .txt和 .csv文件,来生成各区域须要回传的流水
图8中的复杂的SQL语句例如以下:
select listno,‘2014-06-16‘
from
(
select distinct b.LISTNO,b.roadno
--select count(*) asrec_num,sum(b.CASHMONEY)/100 as CASHMONEY,sum(b.ETCMONEY)/100 as ETCMONEY
from
(
selectw.roadno,w.squaddate,w.roadname,w.outvehclass,
sum(w.rec_count) as rec_count1,sum(w.cashmoney) as cashmoney1,sum(w.etcmoney) as etcmoney1
from
(
select *
FROM [流水大于0.csv]
where (备注 is null) and 回送标志=‘回送‘ and(cashmoney+etcmoney)<0
union all
select *
FROM [流水小于0.csv]
where (备注 is null) and 回送标志=‘回送‘ and(cashmoney+etcmoney)<0
) w
group byw.roadno,w.squaddate,w.roadname,w.outvehclass
) a,[管理点与中心都存在部分_全部.txt] b
where ( (b.CASHMONEY+b.ETCMONEY)<0 ) and a.roadno=b.roadno anda.SQUADDATE=b.SQUADDATE
anda.OUTVEHCLASS=b.OUTVEHCLASSNAME
union
select distinct b.LISTNO,b.roadno
--select count(*) asrec_num,sum(b.CASHMONEY)/100 as CASHMONEY,sum(b.ETCMONEY)/100 as ETCMONEY
from
(
selectw.roadno,w.squaddate,w.roadname,w.outvehclass,
sum(w.rec_count) as rec_count1,sum(w.cashmoney) as cashmoney1,sum(w.etcmoney) as etcmoney1
from
(
select *
FROM [流水大于0.csv]
where (备注 is null) and 回送标志=‘回送‘ and(cashmoney+etcmoney)>0
union all
select *
FROM [流水小于0.csv]
where (备注 is null) and 回送标志=‘回送‘ and(cashmoney+etcmoney)>0
) w
group byw.roadno,w.squaddate,w.roadname,w.outvehclass
) a,[管理点与中心都存在部分_全部.txt] b
where ( (b.CASHMONEY+b.ETCMONEY)>0 ) and a.roadno=b.roadno anda.SQUADDATE=b.SQUADDATE
anda.OUTVEHCLASS=b.OUTVEHCLASSNAME
union
select distinct b.LISTNO,b.roadno
--select count(*) asrec_num,sum(b.CASHMONEY)/100 as CASHMONEY,sum(b.ETCMONEY)/100 as ETCMONEY
from
(
selectw.roadno,w.squaddate,w.roadname,w.outvehclass,
sum(w.rec_count) as rec_count1,sum(w.cashmoney) as cashmoney1,sum(w.etcmoney) as etcmoney1
from
(
select *
FROM [流水大于0.csv]
where (备注=‘仅仅管理点存在‘) and 回送标志=‘回送‘ and(cashmoney+etcmoney)<0
union all
select *
FROM [流水小于0.csv]
where (备注=‘仅仅管理点存在‘) and 回送标志=‘回送‘ and(cashmoney+etcmoney)<0
) w
group byw.roadno,w.squaddate,w.roadname,w.outvehclass
) a,[管理点存在中心不存在的流水_全部.txt] b
where ((b.CASHMONEY+b.ETCMONEY)<0 ) and a.roadno=b.roadno anda.SQUADDATE=b.SQUADDATE
anda.OUTVEHCLASS=b.OUTVEHCLASSNAME
union
select distinct b.LISTNO,b.roadno
--select count(*) asrec_num,sum(b.CASHMONEY)/100 as CASHMONEY,sum(b.ETCMONEY)/100 as ETCMONEY
from
(
selectw.roadno,w.squaddate,w.roadname,w.outvehclass,
sum(w.rec_count) as rec_count1,sum(w.cashmoney) as cashmoney1,sum(w.etcmoney) as etcmoney1
from