当前位置:Gxlcms > 数据库问题 > 《万能数据库查询分析器》实现使用SQL语句直接高效地訪问文本文件

《万能数据库查询分析器》实现使用SQL语句直接高效地訪问文本文件

时间: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位

在《程序猿》20072期的“新产品&工具点评”部分,编辑“特别推荐”了“万能数据库查询分析器”公布。本期仅仅点评了5个工具。各自是“Adobe Acrobat 8 中文版”、“迅雷搜索 1.7 新版上线”、“Google 桌面搜索 5.0 中文公布”、“BEA 公布 WebLogic SIPServer 3.0和特别推荐“万能数据库查询分析器”公布。前面4个都是国内外大型软件公司的产品,仅仅有“万能数据库查询分析器”是个人创作的软件。

截止到2013417,在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个文件)中确认哪些批次须要回传(形成个文件。 流水大于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操作系统

     CPU2.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 nulland 回送标志=‘回送‘ and(cashmoney+etcmoney)<0

           union all

           select *

           FROM  [流水小于0.csv] 

           where (备注 is nulland 回送标志=‘回送‘ 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 nulland 回送标志=‘回送‘ and(cashmoney+etcmoney)>0

           union all

           select *

           FROM  [流水小于0.csv] 

           where (备注 is nulland 回送标志=‘回送‘ 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

人气教程排行