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(; ”,”)。

  • 相关阅读:
    排球训练营
    TP5中手机端和PC端判断
    N550JV无法休眠,休眠自动重启的原因及解决方法
    HTML标签全称
    HTML思维导图
    HTML基础
    Web项目流程
    VsCode使用之HTML 中 CSS Class 智能提示
    MyEclipse崩溃 Java was started but returned exit code=-1073740791
    Python 类的特殊成员方法
  • 原文地址:https://www.cnblogs.com/raqsoft/p/5047549.html
Copyright © 2011-2022 走看看