Advertisement

[Kettle] CST时间格式转yyyy-MM-dd HH:mm:ss格式

阅读量:

在当前的需求开发过程中遇到了一个关键问题。项目方提供了一个加密的.dat文件进行解密,并发现存在一个时间戳字段,并且该字段采用的是CST格式存储。例如:Thu Jul 22 00:58:32 CST 2010。然而,在目标数据库中该字段被设计为timestamp类型,并可以使用Kettle工具来进行数据抽取。起初他们直接将该字段的数据类型转换为Date类型的变量,并将其格式化为yyyy-MM-dd HH:mm:ss的形式。经过反复测试发现这种方法不可行

于是转而寻找其他途径. 是否可以用Kettle提供的Java代码库以及JavaScript组件或脚本来实现这一目标呢?经过一番尝试后决定采用该方案.

JavaScript组件实现。

数据源:

本次测试基于date.csv文件进行操作,csv文件中存储的CST时间数据格式如下:

目标表:

PostgreSQL库创建目标表,用来接收。

复制代码
    create table t_string_conver_to_date(join_date timestamp without time zone );

ETL 程序设计程序

请配置获取文件指定路径 date.csv 并接收字段 IN_DATE 的数据值作为字符串处理(Note:此处不允许设置 Date 类型)

JavaScript代码: 主要是将CST格式转换成yyyy-MM-dd HH:mm:ss格式。

复制代码
 //自定义函数

    
 function dateFormat (date, format) {
    
     date = new Date(date);
    
     date.setHours(date.getHours()-14);
    
     var o = {
    
     'M+' : date.getMonth() + 1, //month
    
     'd+' : date.getDate(), //day
    
     'H+' : date.getHours(), //hour
    
     'm+' : date.getMinutes(), //minute
    
     's+' : date.getSeconds(), //second
    
     'q+' : Math.floor((date.getMonth() + 3) / 3), //quarter
    
     'S' : date.getMilliseconds() //millisecond
    
     };
    
  
    
     if (/(y+)/.test(format))
    
     format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
    
  
    
     for (var k in o)
    
     if (new RegExp('(' + k + ')').test(format))
    
         format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length));
    
  
    
     return format;
    
 }
    
  
    
 var DATE_OUT = dateFormat(IN_DATE,"yyyy-MM-dd HH:mm:ss")   //函数调用,输出字段资格,IN_DATE为文本文件传过来的数据流

设置如下,用DATE_OUT接收,类型为String。

字段设置: 字段设置涉及将 DATE_OUT 强制转换为DATE类型,并遵循日期格式yyyy-MM-dd HH:mm:ss。

表输出: 用于将DATE_OUT信息注入到目标表 t_string_conver_to_date.join_date字段中。

以上步骤都设置到了,启动Kettle 转换程序,然后查看表数据,验证OK。

全部评论 (0)

还没有任何评论哟~