zoukankan      html  css  js  c++  java
  • 集算器协助java处理结构化文本之导入数据库

    直接用JAVA将结构化文本文件导入数据库时,需要手工拼凑SQL语句,还需要处理各种麻烦情况,比如:表中数据是否已经存在,是要update还是要insert,文件中是否包含字段,文件中的字段是否和表字段一致。

    使用集算器来辅助Java编程,这些问题都不需要自己写代码解决。下面我们通过例子来看一下具体作法。

    文本文件sales.txt中存储着销售订单数据,列分隔符是tab,前几行数据如下:

    下面,我们要把sales.txt导入到结构相同的空表中。

    先在集算器中编写脚本,脚本名为test.dfx。

    上述脚本中,import函数用来读入文本文件,其默认的列分割符是tab,函数选项@t表示将第一行作为列名。update函数用来将A1中的数据批量导入数据库,这里的OracleDB是数据源名,Tsales是表名。

    上述脚本已经完成了所有的导入工作,接下来只需在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(?)”);
         //类似存储过程的方式执行esProc脚本
         st.execute();

    只要执行上述JAVA代码,sales.txt就会被集算器引擎导入到Tsales表。

    上面的集算器脚本比较简单,因此可以直接将脚本嵌入JAVA代码,而不用脚本文件,如下所示:

        st.executeQuery(“=OracleDB.update(file(“E:\sales.txt”).import@t(),Tsales)”);

    有时,库表并不为空,此时就不能把数据全部导入表中,而应该按照主键来比对。对于主键相同的数据,应当生成update语句,对于库表中没有的主键,应当生成insert语句。这要分几种情况来处理:

    假如库表已经设置了主键(这里是OrderID),则前面的代码无需任何变化。换句话说,集算器引擎可以自动判断数据库主键(包括联合主键),并和文本文件中的字段进行比对,并生成相应的update或insert语句。

    假如库表没有设置主键,则只需在update函数中手工设置主键,即将A2单元格中的脚本改为:=OracleDB.update(A1,Tsales; OrderID)。

    如果不想改变库表原来的数据,集算器也可以只生成insert语句,这是需要在脚本中加入函数选项@i,比如:=OracleDB.update@i(A1,Tsales)。类似的,函数选项@u表示只生成update语句。

    在前面的例子中,我们假设库表和文本文件的结构一致,但有时两者并不完全相同。比如:库表比文本文件的字段多3个,分别是State、OrderYear、Memo,现在要在库表的State字段中填入默认值”done”,OrderYear要从OrderDate中计算出年份,Memo保持空。要解决这个问题,只需书写如下脚本:

    上述脚本中的derive函数可以为A1加入新的字段,也可以加入计算列。Memo字段不用管,update函数会自动略过它。

    如果库表中的字段比文本文件少,则应当只读取部分列,比如:=file(“E:\sales.txt”).import@t(OrderID,SellerId,Amount,OrderDate)。

    这句脚本表示忽略Client字段,只从文件中读取其他四个字段。

    前面的例子中,文本文件的第一行正好是库表中的字段名,但有时文本文件中没有列名信息,我们需要手工对应。代码如下:

    可以就看到,由于第一行不是字段名,因此import函数也无需选项@t,此时,A1的数据会有默认的字段名,依次为:_1,_2,_3等等。Update函数中的Order_ID:_1表示将A1中的字段“_1”导入到库表中的OrderID字段,以此类推。

    如果文本文件中的字段名和库表不一样,比如库表中的Client字段在文本文件中是ClientID,此时可以用同样的办法来对应,代码如下:

    前面的例子中,列分隔符是tab,但有时也会遇到“,”等符号,则只需将import函数修改为:=file(“E:\sales.txt”).import(; ”,”)。

  • 相关阅读:
    remove white space from read
    optimize the access speed of django website
    dowload image from requests
    run jupyter from command
    crawl wechat page
    python version 2.7 required which was not found in the registry windows 7
    health
    alternate rows shading using conditional formatting
    word
    【JAVA基础】static 关键字
  • 原文地址:https://www.cnblogs.com/raqsoft/p/5047549.html
Copyright © 2011-2022 走看看