结构化文本文件零代码导入数据库的方法

? ? ? ? ?直接用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),则前面的代码无需任何变化。换句话说,集算器引擎可以自动判断数据库主键(包括联合主键),并和文本文件中的字段进行比对,并生成相应的updateinsert语句。

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

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

?

?

在前面的例子中,我们假设库表和文本文件的结构一致,但有时两者并不完全相同。比如:库表比文本文件的字段多3个,分别是StateOrderYearMemo,现在要在库表的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(; ”,”)

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。