你的位置:首页 > Java教程

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