比较csv文件中数据差异-创新互联

csv文件存储数据时在结构上基本和一个数据库表相当,不过因为读写方便,所以使用频率很高,例如输出一些临时结果,或者持续记录类似日志形式的数据。不过,当需要对这些数据进一步处理时,如果还要先导入数据库,那么csv本身的便利性也就没有了。

成都创新互联主要从事网站建设、网站制作、网页设计、企业做网站、公司建网站等业务。立足成都服务珲春,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575

事实上,通过集算器,可以直接对csv文件进行处理,而且还可以进行一些“高级”操作,就像本文要介绍的比较两个csv文件的差异。

假设在一个简单的销售系统中,前端系统只负责录入,包括新增、修改和删除订单,同时,每天会把数据文件做一次备份归档。在后期分析中,需要查看某个时间段内的新增、取消和修改的订单。下面就是不使用数据库,直接比较csv文件的操作。

例子中使用了2015年3月的两个文件,早一点的是old.csv,晚一点的是new.csv。文件中的逻辑主键是userName和date,需要分别找出新增的、删除的、修改的数据行。源文件如下:


Old.csvNew.csv

1

2

3

4

5

6

7

8

9

userName,date,saleValue,saleCount

Rachel,2015-03-01,4500,9

Rachel,2015-03-03,8700,4

Tom,2015-03-02,3000,8

Tom,2015-03-03,5000,7

Tom,2015-03-04,6000,12

John,2015-03-02,4000,3

John,2015-03-02,4300,9

John,2015-03-04,4800,4

userName,date,saleValue,saleCount

Rachel,2015-03-01,4500,9

Rachel,2015-03-02,5000,5

Ashley,2015-03-01,6000,5

Rachel,2015-03-03,11700,4

Tom,2015-03-03,5000,7

Tom,2015-03-04,6000,12

John,2015-03-02,4000,3

John,2015-03-02,4300,9

John,2015-03-04,4800,4

直接观察数据,可以看到new.csv中的第2、3行是新增的记录,第4行是修改的记录,old.csv中第3行是删除的记录。

集算器代码如下:


AB
1=file("d:\\old.csv").import@t(;,",")=file("d:\\new.csv").import@t(;,",")
2=A1.sort(userName,date)=B1.sort(userName,date)
3=new=[B2,A2].merge@d(userName,date)
4=delete=[A2,B2].merge@d(userName,date)
5=diff=[B2,A2].merge@d(userName,date,saleValue,saleCount)
6=update=[A5,new].merge@d(userName,date)return update

A1,B1:以逗号为分隔符读入文件。

A2,B2:将数据按照关键字排序。因为后面使用merge函数要求数据有序。

A3:函数merge可进行多数据集归并,使用选项@d表示归并时找出差集。类似地还有并集选项@u,交集选项@i。新增记录实际上就是较新的数据和较旧数据按关键字的差集,计算结果如下:

比较 csv 文件中数据差异

A4:同样的,较旧数据和较新数据按关键字的差集就是删除的记录,计算结果如下:

比较 csv 文件中数据差异

A5:将关键字作为普通字段计算差集,找到修改过的所有记录。计算结果如下:

比较 csv 文件中数据差异

A6:要计算更新的记录,把A5作为中间计算结果,计算A5和“新增”记录之间的差集。计算结果如下:

比较 csv 文件中数据差异

B6:将A6返回给JAVA或报表工具。

上述脚本完成了所有的数据处理工作,接下来还可以通过JDBC将集算器脚本集成在JAVA里。JAVA代码如下:

//建立esProc jdbc连接

Class.forName("com.esproc.jdbc.InternalDriver");

con= DriverManager.getConnection("jdbc:esproc:local://");

//调用esProc,其中test是脚本文件名,可接收参数

st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test()");                      

com.esproc.jdbc.InternalCStatement st = (com.esproc.jdbc.InternalCStatement)con.prepareCall("call test()");

st.execute();//执行esProc存储过程

ResultSet set = st.getResultSet();//获得计算结果

而如果要将多个数据集返回给JAVA,可以将B6的代码改为:return new,delete,update。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


名称栏目:比较csv文件中数据差异-创新互联
浏览地址:http://hbruida.cn/article/pdscc.html