Kettle中JavaScript内置函数说明
<p align="left">本文链接:https://blog.csdn.net/u010192145/article/details/102220563</p><p align="left">我们在使用JavaScript组件的时候,在左侧核心树对象栏中可以看到Kettle为我们提供了很多简洁强大的内置函数,帮助我们在写脚本的时候对数据、参数变量等能很轻松的做处理,体验编码的感觉.本篇将详细介绍JavaScript组件中的函数功能</p>
<p align="left">脚本组件包含的函数主要包括六大类,分别是:</p>
<ul>
<li>字符串类型的函数(String Functions)</li>
<li>浮点型的函数(Numeric Functions)</li>
<li>日期类型函数(Date Functions)</li>
<li>逻辑判断型函数(Logic Functions)</li>
<li>特殊的函数(Special Functions)</li>
<li>文件处理类函数(File Functions)</li>
</ul>
<p align="left"><strong>字符串类型函数(String Functions)</strong></p>
<p align="left">顾名思义,字符串类型的函数肯定是针对字符串类型的参数、变量进行处理操作的函数</p>
<p align="left"><strong>日期转字符串(</strong><strong>date2str</strong><strong>)</strong></p>
<p align="left">日期转字符串函数date2str主要有4个方法,分别是:</p>
<ul>
<li>date2str(date):传入日期实例,转换成字符串类型</li>
<li>date2str(date,format):传入日期和格式化参数,进行格式化转换</li>
<li>date2str(date,format,iso):传入日期和参数格式化及ISO代码进行转换,(DE = German, EN = English, FR = France, …)</li>
<li>date2str(date,format,iso,zone):传入时区进行格式化,例如北京时区(GMT+8)</li>
</ul>
<p align="left">日期格式化参数format参数类型供参考:</p>
<ol>
<li>yy / yyyy - 06 / 2006</li>
<li>MM / MMM / MMMMM - 11 / Nov / November</li>
<li>d / dd - 1 / 01</li>
<li>E / EEEE - Tue / Tuesday</li>
<li>hh / HH - 11 / 23</li>
<li>m / mm - 5 / 05</li>
<li>s / ss - 8 / 08</li>
</ol>
<p align="left">代码示例:</p>
<ol>
<li>var dValue = new Date();</li>
<li>writeToLog(date2str(dValue,"dd.MM.yyyy"));</li>
<li>writeToLog(date2str(dValue,"dd.MM.yyyy HH:mm:ss"));</li>
<li>writeToLog(date2str(dValue,"E.MMM.yyyy","DE"));</li>
<li>writeToLog(date2str(dValue,"dd.MM.yyyy HH:mm:ss","EN"));</li>
<li>writeToLog(date2str(dValue,"dd.MM.yyyy HH:mm:ss","ZH", "GMT+8"));</li>
<li>writeToLog(date2str(dValue,"yyyy-MM-dd HH:mm:ss","ZH", "GMT+8"));</li>
</ol>
<p align="left">以上代码在控制台将会输出如下:</p>
<ol>
<li>2019/08/19 10:12:56 - JavaScript代码.0 - 19.08.2019</li>
<li>2019/08/19 10:12:56 - JavaScript代码.0 - 19.08.2019 10:12:56</li>
<li>2019/08/19 10:12:56 - JavaScript代码.0 - Mo.Aug.2019</li>
<li>2019/08/19 10:12:56 - JavaScript代码.0 - 19.08.2019 10:12:56</li>
<li>2019/08/19 10:12:56 - JavaScript代码.0 - 19.08.2019 10:12:56</li>
<li>2019/08/19 10:12:56 - JavaScript代码.0 - 2019-08-19 10:12:56</li>
</ol>
<p align="left"><strong>转义HTML</strong><strong>escapeHtml(html)</strong></p>
<p align="left">代码如下:</p>
<ol>
<li>var html="<h1>我是H2标题</h2>";</li>
<li> </li>
<li>writeToLog(escapeHtml(html))</li>
</ol>
<p align="left">最终输出</p>
<p align="left">2019/08/19 10:16:13 - JavaScript代码.0 - &lt;h1&gt;&#25105;&#26159;H2&#26631;&#39064;&lt;/h2&gt;</p>
<p align="left"><strong>转义SQL(</strong><strong>escapeSQL(var)</strong><strong>)</strong></p>
<ol>
<li>var str1 = "SELECT * FROM CUSTOMER WHERE NAME='" + escapeSQL("McHale's Navy") + "'"; </li>
<li>writeToLog(str1)</li>
<li> </li>
</ol>
<p align="left">该函数会把单引号转成双引号,输出结果如下:</p>
<p align="left">2019/08/19 10:18:59 - JavaScript代码.0 - SELECT * FROM CUSTOMER WHERE NAME='McHale''s Navy'</p>
<p align="left"><strong>构造定长字符串(</strong><strong>fillString(char,length)</strong><strong>)</strong></p>
<p align="left">代码示例如下:</p>
<ol>
<li>writeToLog(fillString("x",10));</li>
<li>writeToLog(fillString("A",3));</li>
</ol>
<p align="left">最终会输出10个X和3个A,输出结果如下:</p>
<ol>
<li>2019/08/19 10:24:08 - JavaScript代码.0 - xxxxxxxxxx</li>
<li>2019/08/19 10:24:08 - JavaScript代码.0 - AAA</li>
</ol>
<p align="left">需要注意的是第一个是一个char类型的单字符,不能是字符串</p>
<p align="left"><strong>统计字符串出现频次(</strong><strong>getOcuranceString(str,searchStr)</strong><strong>)</strong></p>
<p align="left">第一个参数是要搜索的完整字符串,第二个参数是要搜索统计的字符串</p>
<p align="left">代码示例:</p>
<ol>
<li>var sef='2007-09-11';</li>
<li> </li>
<li>writeToLog(getOcuranceString(sef,'0'))</li>
<li>writeToLog(getOcuranceString(sef,'00'))</li>
</ol>
<p align="left">我们分别统计字符串0和00最终出现的次数,此时,日志最终打印的次数是3和1:</p>
<ol>
<li>2019/08/19 10:28:45 - JavaScript代码.0 - 3</li>
<li>2019/08/19 10:28:45 - JavaScript代码.0 - 1</li>
</ol>
<p align="left"><strong>获取字符串下标索引(</strong><strong>indexOf</strong><strong>)</strong></p>
<p align="left">获取下标索引主要有2个重构函数,分别是:</p>
<ul>
<li>indexOf(string,subString):获取出现字符串的索引开始位置</li>
<li>indexOf(string,subString,fromIndex);指定开始位置,获取字符串索引开始位置</li>
</ul>
<p align="left">代码示例:</p>
<ol>
<li>var str1= "Hello Pentaho!";</li>
<li>var str2= indexOf(str1, "Pentaho");</li>
<li>var str3= indexOf(str1, "o", 7);</li>
<li>writeToLog("Input : " + str1);</li>
<li>writeToLog("Index of 'Pentaho' : " + str2);</li>
<li>writeToLog("index of 'o', search from position 7 : " + str3);</li>
</ol>
<p align="left">最终控制台输出:</p>
<ol>
<li>2019/08/19 10:34:16 - JavaScript代码.0 - Input : Hello Pentaho!</li>
<li>2019/08/19 10:34:16 - JavaScript代码.0 - Index of 'Pentaho' : 6</li>
<li>2019/08/19 10:34:16 - JavaScript代码.0 - index of 'o', search from position 7 : 12</li>
</ol>
<p align="left"><strong>首字母大写(</strong><strong>initCap</strong><strong>)</strong></p>
<p align="left">对指定字符串首字母大写处理,来看代码示例:</p>
<ol>
<li>var str1 = "my home"; </li>
<li>writeToLog(initCap(str1));</li>
<li>writeToLog(initCap('test a aaa cw'));</li>
<li>writeToLog(initCap('myhome'));</li>
</ol>
<p align="left">此时,最终控制台输出如下:</p>
<ol>
<li>2019/08/19 10:41:27 - JavaScript代码.0 - My Home</li>
<li>2019/08/19 10:41:27 - JavaScript代码.0 - Test A Aaa Cw</li>
<li>2019/08/19 10:41:27 - JavaScript代码.0 - Myhome</li>
</ol>
<p align="left"><strong>字符串转小写(</strong><strong>lower</strong><strong>)</strong></p>
<p align="left">将传入字符串全部转小写</p>
<p align="left">代码如下:</p>
<ol>
<li>var str1= "Hello World!";</li>
<li>var str2= lower(str1);</li>
<li>writeToLog("Input:" + str1);</li>
<li>writeToLog("Converted to LowerCase:" + str2);</li>
<li>writeToLog(lower('DDDHelloSWxss'))</li>
</ol>
<p align="left">响应内容</p>
<ol>
<li>2019/08/19 10:43:09 - JavaScript代码.0 - Input:Hello World!</li>
<li>2019/08/19 10:43:09 - JavaScript代码.0 - Converted to LowerCase:hello world!</li>
<li>2019/08/19 10:43:09 - JavaScript代码.0 - dddhelloswxss</li>
</ol>
<p align="left"><strong>字符串填充左侧(</strong><strong>lpad(string,char,length)</strong><strong>)</strong></p>
<p align="left">用指定长度的给定字符将字符串填充到左侧</p>
<p align="left">参数定义:</p>
<ul>
<li>1:传入字符串</li>
<li>2:填充单字符</li>
<li>3:填充单字符长度</li>
</ul>
<p align="left">如果length长度超过给定字符串的长度,将对填充字符串做减法,例如:</p>
<ol>
<li>var str1= "Hello World!";</li>
<li>writeToLog("Lpad:" + lpad(str1, "x",20));</li>
</ol>
<p align="left">此时,最终输出结果为:</p>
<p align="left">2019/08/19 10:46:38 - JavaScript代码.0 - Lpad:xxxxxxxxHello World!</p>
<p align="left">最终的完成长度是20个字符长度,因此填充的单字符x并没有填充20次</p>
<p align="left">如果length长度小于给定字符串的长度,则默认返回原字符串,不做填充,代码示例:</p>
<ol>
<li>var str1= "Hello World!";</li>
<li>writeToLog("Lpad:" + lpad(str1, "x",5));</li>
</ol>
<p align="left">此时最终的输出结果为:</p>
<p align="left">2019/08/19 10:46:38 - JavaScript代码.0 - Lpad:Hello World!</p>
<p align="left"><strong>去空字符(</strong><strong>ltrim</strong><strong>)</strong></p>
<p align="left">从左侧开始去除空字符串</p>
<p align="left"><strong>数字转字符串(</strong><strong>num2str</strong><strong>)</strong></p>
<p align="left">给定数字,转换为字符串,主要有3个构造函数:</p>
<ul>
<li>num2str(num):转换num数字为字符串</li>
<li>num2str(num,format):格式化数字为指定字符串</li>
<li>num2str(num,format,iso):按照本地ISO编码进行格式化</li>
</ul>
<p align="left">代码示例如下:</p>
<ol>
<li>var d1 = 123.40;</li>
<li>var d2 = -123.40;</li>
<li>writeToLog(num2str(d1));</li>
<li>writeToLog(num2str(d1, "0.00"));</li>
<li>writeToLog(num2str(d1, "0.00", "EN"));</li>
<li>writeToLog(num2str(d2, "0.00;(0.00)", "EN"));</li>
</ol>
<p align="left">最终控制台输出:</p>
<ol>
<li>2019/08/19 11:00:17 - JavaScript代码.0 - 123.4</li>
<li>2019/08/19 11:00:17 - JavaScript代码.0 - 123.40</li>
<li>2019/08/19 11:00:17 - JavaScript代码.0 - 123.40</li>
<li>2019/08/19 11:00:17 - JavaScript代码.0 - (123.40)</li>
</ol>
<p align="left"><strong>XML</strong><strong>保护标签函数转换(</strong><strong>protectXMLCDATA</strong><strong>)</strong></p>
<p align="left">传入给定字符串,添加标准保护,代码示例</p>
<ol>
<li>var str1 = "my home"; </li>
<li>writeToLog(protectXMLCDATA(str1));</li>
</ol>
<p align="left">此时,将会给变量str1加上保护标签</p>
<ol>
<li>2019/08/19 11:02:09 - JavaScript代码.0 - <!]></li>
<li> </li>
</ol>
<p align="left"><strong>移除字符串中CRLF字符(</strong><strong>removeCRLF(str)</strong><strong>)</strong></p>
<p align="left">给定字符串中删除CR END LF的字符串</p>
<p align="left"><strong>替换字符串(</strong><strong>replace</strong><strong>)</strong></p>
<p align="left">替换字符串主要包括两个构造函数:</p>
<ul>
<li>replace(str,searchStr,replaceStr):从指定字符串中查询,然后替换</li>
<li>replace(str,firstSearch,firstReplace,secondSearch,SecondReplace...):无限查询替换</li>
</ul>
<p align="left">代码示例如下:</p>
<ol>
<li>var str1 = "Hello World, this is a nice function"; </li>
<li>var str2 = replace(str1,"World", "Folk");</li>
<li>writeToLog(str2);</li>
<li>var str2 = replace(str1,"World", "Folk", "nice","beautifull");</li>
<li>writeToLog(str2);</li>
</ol>
<p align="left">最终输出:</p>
<ol>
<li>2019/08/19 11:10:21 - JavaScript代码.0 - Hello Folk, this is a nice function</li>
<li>2019/08/19 11:10:21 - JavaScript代码.0 - Hello Folk, this is a beautifull function</li>
</ol>
<p align="left"><strong>字符串右侧填充(</strong><strong>rpad(string,char,length</strong><strong>))</strong></p>
<p align="left">使用方法同lpad,只是一个是左侧,一个是右侧</p>
<p align="left"><strong>去除空字符(右侧)(</strong><strong>rtrim</strong><strong>)</strong></p>
<p align="left"><strong>正则切分(</strong><strong>str2RegExp</strong><strong>)</strong></p>
<p align="left">出入一个正则表达式,对string字符串进行Split操作.代码如下:</p>
<ol>
<li>var strToMatch = "info@proconis.de";</li>
<li>var strReg = "^(\\w+)@(+?)\\.({2,3})$";</li>
<li>var xArr = str2RegExp(strToMatch, strReg);</li>
<li>if ( xArr != null ) {</li>
<li> for(i=0;i<xArr.length;i++) {</li>
<li> writeToLog(xArr);</li>
<li> }</li>
<li>}</li>
<li>else {</li>
<li> writeToLog("no match");</li>
<li>}</li>
</ol>
<p align="left">最终控制台输出:</p>
<ol>
<li>2019/08/19 13:21:19 - JavaScript代码.0 - info</li>
<li>2019/08/19 13:21:19 - JavaScript代码.0 - proconis</li>
<li>2019/08/19 13:21:19 - JavaScript代码.0 - de</li>
</ol>
<p align="left"><strong>字符串截取(</strong><strong>substr</strong><strong>)</strong></p>
<p align="left">通过制定索引开始对字符串进行截取操作,主要有两个重构参数:</p>
<ul>
<li>substr(string,from):指定from索引开始截取字符串</li>
<li>substr(string,from,to):指定开始和截止索引进行截取</li>
</ul>
<p align="left">代码示例:</p>
<ol>
<li>var str1= "Hello Pentaho!";</li>
<li>var str2= substr(str1, 6);</li>
<li>var str3= substr(str1, 6, 7);</li>
<li>writeToLog("Input : " + str1);</li>
<li>writeToLog("From position 6: " + str2);</li>
<li>writeToLog("From position 6 for 7 long : " + str3);</li>
</ol>
<p align="left">控制台输出如下:</p>
<ol>
<li>2019/08/19 13:31:20 - JavaScript代码.0 - Input : Hello Pentaho!</li>
<li>2019/08/19 13:31:20 - JavaScript代码.0 - From position 6: Pentaho!</li>
<li>2019/08/19 13:31:20 - JavaScript代码.0 - From position 6 for 7 long : Pentaho</li>
</ol>
<p align="left"><strong>去除左右空格(</strong><strong>trim</strong><strong>)</strong></p>
<p align="left"><strong>不转义HTML(</strong><strong>unEscapeHtml(html)</strong><strong>)</strong></p>
<p align="left">针对以转义的HTML字符进行解密,代码如下:</p>
<ol>
<li>var w='<h2>我是H2标题</h2>';</li>
<li> </li>
<li>var esW=escapeHtml(w);</li>
<li>var unesw=unEscapeHtml(esW);</li>
<li> </li>
<li>writeToLog(esW);</li>
<li>writeToLog(unesw);</li>
</ol>
<p align="left">最终控制台输出:</p>
<ol>
<li>2019/08/19 13:38:16 - JavaScript代码.0 - &lt;h2&gt;&#25105;&#26159;H2&#26631;&#39064;&lt;/h2&gt;</li>
<li>2019/08/19 13:38:16 - JavaScript代码.0 - <h2>我是H2标题</h2></li>
<li> </li>
</ol>
<p align="left"><strong>解码转义XML(</strong><strong>unEscapeXml </strong><strong>)</strong></p>
<p align="left"><strong>字符串转大写(</strong><strong>upper</strong><strong>)</strong></p>
<p align="left">将传入字符串全部转大写.例如:</p>
<ol>
<li>var str="Hello World";</li>
<li>writeToLog(upper(str));</li>
</ol>
<p align="left"><strong>浮点型的函数(Numeric Functions)</strong></p>
<p align="left"><strong>计算绝对值(</strong><strong>abs(num)</strong><strong>)</strong></p>
<p align="left">计算一个数值的绝对值,代码示例:</p>
<ol>
<li>var d1 = -1234.01;</li>
<li>var d2 = 1234.01;</li>
<li>writeToLog(abs(d1));</li>
<li>writeToLog(abs(d2));</li>
</ol>
<p align="left">最终控制台输出为:</p>
<ol>
<li>2019/08/19 13:51:00 - JavaScript代码.0 - 1234.01</li>
<li>2019/08/19 13:51:00 - JavaScript代码.0 - 1234.01</li>
</ol>
<p align="left"><strong>最小双精度值(</strong><strong>ceil(num)</strong><strong>)</strong></p>
<p align="left">返回最小的双精度值。该值将被四舍五入。代码示例:</p>
<ol>
<li>var d1 = -1234.01;</li>
<li>var d2 = 1234.01;</li>
<li>writeToLog(ceil(d1));</li>
<li>writeToLog(ceil(d2));</li>
</ol>
<p align="left">最终控制台输出:</p>
<ol>
<li>2019/08/19 13:52:40 - JavaScript代码.0 - -1234</li>
<li>2019/08/19 13:52:40 - JavaScript代码.0 - 1235</li>
</ol>
<p align="left"><strong>最大数值(</strong><strong>floor(num)</strong><strong>)</strong></p>
<p align="left">返回最大数值,该值将被四舍五入,代码示例:</p>
<ol>
<li>var d1 = -1234.01;</li>
<li>var d2 = 1234.01;</li>
<li>writeToLog(floor(d1));</li>
<li>writeToLog(floor(d2));</li>
</ol>
<p align="left">运行结果如下:</p>
<ol>
<li>2019/08/19 13:55:13 - JavaScript代码.0 - -1235</li>
<li>2019/08/19 13:55:13 - JavaScript代码.0 - 1234</li>
</ol>
<p align="left"><strong>字符串转数值(</strong><strong>str2num(var)</strong><strong>)</strong></p>
<p align="left">字符串转数值主要包含两个构造函数,分别是</p>
<ul>
<li>str2num(str):传入数值字符串,进行格式化转换</li>
<li>str2num(str,format):通过指定格式进行数值转换</li>
</ul>
<p align="left">代码示例如下:</p>
<ol>
<li>var str1 = "1.234,56";</li>
<li>var str2 = "12";</li>
<li>writeToLog((str2num(str1,"#,##0.00")));</li>
<li>writeToLog((str2num(str2)));</li>
</ol>
<p align="left">最终控制台输出:</p>
<ol>
<li>2019/08/19 14:02:19 - JavaScript代码.0 - 1.234</li>
<li>2019/08/19 14:02:19 - JavaScript代码.0 - 12</li>
</ol>
<p align="left"><strong>截取数值(</strong><strong>trunc</strong><strong>)</strong></p>
<p align="left">trunc(1234.9); // 返回 1234</p>
<p align="left"><strong>日期类型函数(Date Functions)</strong></p>
<p align="left"><strong>日期相加(</strong><strong>dateAdd</strong><strong>)</strong></p>
<p align="left">针对日期变量进行相应的添加时间,添加频率包括年、月、日、时、分、秒 等等</p>
<p align="left">函数定义:dateAdd(date,format,plusNum)</p>
<ul>
<li>date:日期对象</li>
<li>format:要加的类型</li>
<li>plusNum:加的数值</li>
</ul>
<p align="left">相加类型主要包括:</p>
<ul>
<li>y:年</li>
<li>m:月</li>
<li>d:日</li>
<li>w:周</li>
<li>wd:工作日</li>
<li>hh:小时</li>
<li>mi:分钟</li>
<li>ss:秒</li>
</ul>
<p align="left">代码示例如下:</p>
<ol>
<li>var d1 = new Date();</li>
<li> </li>
<li>var fmt='yyyy-MM-dd HH:mm:ss';</li>
<li>writeToLog("当前时间:"+date2str(d1,fmt));</li>
<li>var py=dateAdd(d1,'y',1);</li>
<li>var fy=date2str(py,fmt);</li>
<li>writeToLog("加1年:"+fy);</li>
</ol>
<p align="left">最终控制台输出:</p>
<ol>
<li>2019/08/19 14:17:41 - JavaScript代码.0 - 当前时间:2019-08-19 14:17:41</li>
<li>2019/08/19 14:17:41 - JavaScript代码.0 - 加1年:2020-08-19 14:17:41</li>
</ol>
<p align="left"><strong>日期比较(</strong><strong>dateDiff</strong><strong>)</strong></p>
<p align="left">两个日期相互比较</p>
<p align="left">函数定义:dateDiff(startDate,endDate,type)</p>
<ul>
<li>startDate:开始日期</li>
<li>endDate:截止日期</li>
<li>type:返回相差数值类型</li>
</ul>
<p align="left">类型主要包括:</p>
<ul>
<li>y:年</li>
<li>m:月</li>
<li>d:日</li>
<li>w:周</li>
<li>wd:工作日</li>
<li>hh:小时</li>
<li>mi:分钟</li>
<li>ss:秒</li>
</ul>
<p align="left"><strong>获取指定日期数值(</strong><strong>getDayNumber</strong><strong>)</strong></p>
<p align="left">根据类型获取指定日期的数值</p>
<p align="left">函数定义:getDayNumber(date,type)</p>
<ul>
<li>date:当前日期实例</li>
<li>type:类别</li>
</ul>
<p align="left">类别主要分四类</p>
<ul>
<li>y:获取当年的天数</li>
<li>m:获取当月的天数</li>
<li>w:获取本周的天数</li>
<li>wm:获取当月中本周的天数</li>
</ul>
<p align="left">代码示例:</p>
<ol>
<li>var d1 = new Date();</li>
<li>writeToLog(getDayNumber(d1, "y"));</li>
<li>writeToLog(getDayNumber(d1, "m"));</li>
<li>writeToLog(getDayNumber(d1, "w"));</li>
<li>writeToLog(getDayNumber(d1, "wm"));</li>
</ol>
<p align="left"><strong>getFiscalDate</strong></p>
<ol>
<li>// Returns the fiscal Date from the date value,</li>
<li>// based on a given offset.</li>
<li>//</li>
<li>// Usage:</li>
<li>// getFiscalDate(var);</li>
<li>// 1: Date - The Variable with the Date.</li>
<li>// 2: String - The Date/Month which represents</li>
<li>// the fiscal Start Offset. Format allways "dd.MM.".</li>
<li>//</li>
<li>// 2006-11-15</li>
<li>//</li>
<li>var d1 = new Date();</li>
<li>var str1 = "01.07.";</li>
<li>var str2 = "10.12.";</li>
<li>Alert(getFiscalDate(d1, str1));</li>
<li>Alert(getFiscalDate(d1, str2));</li>
</ol>
<p align="left"><strong>获取下一个工作日日期(</strong><strong>getNextWorkingDay</strong><strong>)</strong></p>
<p align="left">传入当前日期,获取该日期后面一个工作日日期</p>
<p align="left">函数定义getNextWorkingDay(date)</p>
<p align="left">代码示例如下:</p>
<ol>
<li>var d1 = new Date();</li>
<li> </li>
<li>// 周1</li>
<li>var d2=str2date('2019-08-19 16:36:00',fmt);</li>
<li>//周 6</li>
<li>var d3=str2date('2019-08-17 16:36:00',fmt);</li>
<li> </li>
<li>writeToLog(date2str(getNextWorkingDay(d1),fmt));</li>
<li>writeToLog(date2str(getNextWorkingDay(d2),fmt));</li>
<li>writeToLog(date2str(getNextWorkingDay(d3),fmt));</li>
</ol>
<p align="left">我们这d2和d3变量中定义了不同的日期实例,分别是周1和周6,最终通过getNextWorkingDay能获取得到下一个工作日日期,控制台输出如下:</p>
<ol>
<li>2019/08/19 16:37:38 - JavaScript代码.0 - 2019-08-20 16:37:38</li>
<li>2019/08/19 16:37:38 - JavaScript代码.0 - 2019-08-20 16:36:00</li>
<li>2019/08/19 16:37:38 - JavaScript代码.0 - 2019-08-19 16:36:00</li>
</ol>
<p align="left"><strong>获取当前月份数值(</strong><strong>month(date)</strong><strong>)</strong></p>
<p align="left">获取当前日期的月份数值,需要注意的是,该值的月份是从0开始的,因此我们最终得到的结果应该+1才是我们的真实月份数值,代码示例:</p>
<ol>
<li>var d1 = new Date();//2019/08/19</li>
<li>writeToLog(month(d1)); //最终输出为7</li>
</ol>
<p align="left"><strong>获取当前时间的季度值(</strong><strong>quarter(date)</strong><strong>)</strong></p>
<p align="left">根据指定日期获取当前季度数值</p>
<ol>
<li>var d1 = new Date();//2019/08/19</li>
<li>writeToLog(quarter(d1));//最终输出为3(代表第三季度)</li>
</ol>
<p align="left"><strong>字符串转日期(</strong><strong>str2date</strong><strong>)</strong></p>
<p align="left">字符串转日期和日期转字符串有点类似,只不过主体对换了一下,但是传入的格式参数都是一样的,主要有4个重载函数:</p>
<ul>
<li>str2date(str):默认转换</li>
<li>str2date(str,format):传入format格式化参数</li>
<li>str2date(str,format,iso):根据iso编码及格式化参数进行转换</li>
<li>str2date(str,format,iso,timezone):根据不同时区的iso编码进行格式化转换</li>
</ul>
<p align="left">代码示例如下:</p>
<ol>
<li>writeToLog(str2date("01.12.2006","dd.MM.yyyy"));</li>
<li>writeToLog(str2date("01.12.2006 23:23:01","dd.MM.yyyy HH:mm:ss"));</li>
<li>writeToLog(str2date("Tue.May.2006","E.MMM.yyyy","EN"));</li>
<li>writeToLog(str2date("22.02.2008 23:23:01","dd.MM.yyyy HH:mm:ss","DE"));</li>
<li>writeToLog(str2date("22.02.2008 23:23:01","dd.MM.yyyy HH:mm:ss","DE", "EST"));</li>
</ol>
<p align="left"><strong>截取日期(</strong><strong>truncDate(date,type)</strong><strong>)</strong></p>
<p align="left">指定截取不同的日期部分,函数定义truncDate(date,type)</p>
<ul>
<li>date:当前日期实例</li>
<li>type:截取类型</li>
</ul>
<p align="left">类型主要有6中,分别是整型,从0-5:</p>
<ul>
<li>5:截取月份</li>
<li>4:截取天数</li>
<li>3:截取小时</li>
<li>2:截取分钟</li>
<li>1:截取秒</li>
<li>0:截取毫秒</li>
</ul>
<p align="left">代码示例 如下:</p>
<ol>
<li>var dateTime = new Date();</li>
<li>var date0 = truncDate(dateTime, 0); // gives back today at yyyy/MM/dd HH:mm:ss.000</li>
<li>var date1 = truncDate(dateTime, 1); // gives back today at yyyy/MM/dd HH:mm:00.000</li>
<li>var date2 = truncDate(dateTime, 2); // gives back today at yyyy/MM/dd HH:00:00.000</li>
<li>var date3 = truncDate(dateTime, 3); // gives back today at yyyy/MM/dd 00:00:00.000</li>
<li>var date4 = truncDate(dateTime, 4); // gives back today at yyyy/MM/01 00:00:00.000</li>
<li>var date5 = truncDate(dateTime, 5); // gives back today at yyyy/01/01 00:00:00.000</li>
</ol>
<p align="left"><strong>获取当年的周数(</strong><strong>week</strong><strong>)</strong></p>
<p align="left">获取指定日期的周数,代码示例:</p>
<ol>
<li>var d1 = new Date(); //2019/08/19</li>
<li> </li>
<li>writeToLog(week(d1));// 返回34</li>
</ol>
<p align="left"><strong>获取年份(</strong><strong>year</strong><strong>)</strong></p>
<p align="left">获取传入日期的年份,代码示例:</p>
<ol>
<li>var d1 = new Date(); //2019/08/19</li>
<li> </li>
<li>writeToLog(year(d1));// 返回2019</li>
</ol>
<p align="left"><strong>逻辑判断型函数(Logic Functions)</strong></p>
<p align="left"><strong>isCodepage</strong></p>
<p align="left">判断字符串的codepage项,代码示例:</p>
<ol>
<li>var xStr = "Réal";</li>
<li>writeToLog(isCodepage(xStr, "UTF-8"));// true</li>
<li>writeToLog(isCodepage(xStr, "windows-1250"));// true</li>
</ol>
<p align="left"><strong>是否日期(</strong><strong>isDate(str)</strong><strong>)</strong></p>
<p align="left">判断当前字符串是否日期</p>
<ol>
<li>var d1 = "Hello World"; </li>
<li>var d2 = new Date();</li>
<li>writeToLog(isDate(d1));//false</li>
<li>writeToLog(isDate(d2));//true</li>
</ol>
<p align="left"><strong>是否为空(</strong><strong>isEmpty(str)</strong><strong>)</strong></p>
<p align="left">判断字符串是否为空</p>
<ol>
<li>var d = "Hello World"; </li>
<li>Alert(isEmpty(d));//false</li>
</ol>
<p align="left"><strong>判断字符串是否为邮箱标准格式(</strong><strong>isMailValid(str)</strong><strong>)</strong></p>
<p align="left">判断一个字符串是否是邮箱</p>
<p align="left"><strong>判断是否是数值(</strong><strong>isNum(str)</strong><strong>)</strong></p>
<p align="left">判断一个字符串是否是数值</p>
<ol>
<li>var str1 = "Hello World"; </li>
<li>var str2 = 123456;</li>
<li>Alert(isNum(str1));//false</li>
<li>Alert(isNum(str2));//true</li>
</ol>
<p align="left"><strong>是否正则匹配(</strong><strong>isRegExp</strong><strong>)</strong></p>
<p align="left">判断给定的正则表达式是否匹配当前的字符串,主要有2个函数定义:</p>
<ul>
<li>isRegExp(str,reg):给定正则判断字符串是否匹配</li>
<li>isRegExp(str,reg1,reg2,reg3…);可以递归判断正则匹配</li>
</ul>
<p align="left">最终返回的是匹配的次数数值,如果不匹配,返回-1</p>
<p align="left">代码示例如下:</p>
<ol>
<li>var email1 ="info@proconis.de";</li>
<li>var email2= "support@proconis.co.uk";</li>
<li>var email3= "HelloWorld@x";</li>
<li> </li>
<li>var reg1="^\\w+@+?\\.{2,3}$";</li>
<li>var reg2="^[\\w-\.]+@([\\w-]+\\.)+[\\w-]{2,4}$";</li>
<li> </li>
<li>writeToLog(isRegExp(email1, reg1,reg2) + " Matches"); //1</li>
<li>writeToLog(isRegExp(email2, reg1,reg2) + " Matches"); //2</li>
<li>writeToLog(isRegExp(email3, reg1,reg2) + " Matches");// 1</li>
</ol>
<p align="left"><strong>是否工作日(</strong><strong>isWorkingDay(date)</strong><strong>)</strong></p>
<p align="left">判断某日期是否是工作日,代码示例:</p>
<ol>
<li>var d1 = new Date();//周1</li>
<li>var d2=str2date('2019-08-17','yyyy-MM-dd') //周六</li>
<li>writeToLog(isWorkingDay(d1));//true</li>
<li>writeToLog(isWorkingDay(d2));//false</li>
</ol>
<p align="left"><strong>特殊的函数(Special Functions)</strong></p>
<p align="left"><strong>弹框信息(</strong><strong>Alert(msg)</strong><strong>)</strong></p>
<p align="left">在屏幕前弹出一个信息框</p>
<p align="left"><strong>加载JavaScript文件(</strong><strong>LoadScriptFile</strong><strong>)</strong></p>
<p align="left">将一个javascript文件加载到实际的运行上下文中。应该从定义的StartScript调用此函数,否则,每次处理都会加载javascript文件行。</p>
<p align="left">代码示例如下:</p>
<ol>
<li>var xPfad = "F:/bak/Hello.js";</li>
<li>LoadScriptFile(xPfad);</li>
</ol>
<p align="left">此时,我们的外部JS文件仅仅是包含一句简单的输出,如下:</p>
<p align="left">writeToLog("Hello LoadScriptFile,outSide JS File ");</p>
<p align="left">最终运行时,控制台会打印出我们在外部JS中的输出行</p>
<p align="left"><strong>从当前Tab栏加载JS并运行(</strong><strong>LoadScriptFromTab</strong><strong>)</strong></p>
<p align="left">如果我们在当前的JavaScript组件中通过模块化的方式编写了很多脚本代码,我们可以通过LoadScriptFromTab函数进行相互调用,这对于开发抽象来说是很好的,代码示例如下:</p>
<ol>
<li>writeToLog("外部Tab加载JS-------------------------")</li>
<li>LoadScriptFromTab('Item_1');</li>
</ol>
<p align="left"><strong>有效卡号判断(</strong><strong>LuhnCheck</strong><strong>)</strong></p>
<p align="left">如果给定的是一个有效的卡号,则返回true</p>
<ol>
<li>var str1 = "4444333322221111"; </li>
<li>writeToLog(str1 + ": " + LuhnCheck(str1)); //true</li>
<li> </li>
<li>var str2 = "4444333322221110"; </li>
<li>writeToLog(str2 + ": " + LuhnCheck(str2));//false</li>
<li> </li>
</ol>
<p align="left"><strong>向文件中追加数据(</strong><strong>appendToFile</strong><strong>)</strong></p>
<p align="left">向指定文件中追加数据,如果文件不存在则创建文件</p>
<ol>
<li>var file = "F:/bak/log.txt";</li>
<li> </li>
<li>for(var i=0;i<100;i++){</li>
<li> appendToFile(file,'TEST'+i+"\r\n");</li>
<li>}</li>
<li> </li>
</ol>
<p align="left">此时,该代码会向log.txt文件输出100条数据行</p>
<p align="left"><strong>decode</strong><strong>函数</strong></p>
<p align="left">decode函数有点类似于IF-THEN-ELSE语句,即表示通过给定查询的字符串是否存在,如果存在,即替换,否则返回默认值</p>
<p align="left">代码示例:</p>
<ol>
<li>var str1 = "Hallo";</li>
<li>writeToLog(decode(str1, "Hallo", "Hello"));</li>
<li>writeToLog(decode(str1, "1", "Mr", "2", "Mrs", "N/A"));</li>
<li>writeToLog(decode(str1, "1", "Mr", "2", "Mrs"));</li>
<li>str1 = "Mrs";</li>
<li>writeToLog(decode(str1, "1", "Mr", "2", "Mrs"));</li>
</ol>
<p align="left">控制台输出:</p>
<ol>
<li>2019/08/19 17:39:01 - JavaScript代码.0 - Hello</li>
<li>2019/08/19 17:39:01 - JavaScript代码.0 - N/A</li>
<li>2019/08/19 17:39:01 - JavaScript代码.0 - Hallo</li>
<li>2019/08/19 17:39:01 - JavaScript代码.0 - Mrs</li>
</ol>
<p align="left"><strong>执行命令(</strong><strong>execProcess</strong><strong>)</strong></p>
<p align="left">代码如下:</p>
<ol>
<li>var t=execProcess('ping www.baidu.com');</li>
<li>writeToLog(t)</li>
</ol>
<p align="left">调用命令行,ping百度的网址,最终输出返回数据</p>
<p align="left"><strong>执行SQL语句(</strong><strong>fireToDB</strong><strong>)</strong></p>
<p align="left">通过获取数据库连接名称,传递SQL语句,以返回SQL查询的值,函数定义:</p>
<ul>
<li>fireToDB(connectionName,SQL);第一个参数为数据库连接名称,我们在JNDI中定义的名称,第二个参数为SQL语句</li>
</ul>
<ol>
<li>var strConn = "MY Connection";</li>
<li>var strSQL = "SELECT COUNT(*) FROM ...";</li>
<li>var xArr = fireToDB(strConn, strSQL);</li>
</ol>
<p align="left"><strong>仅仅获取数值(</strong><strong>getDigitsOnly</strong><strong>)</strong></p>
<p align="left">在给定的字符串中仅仅筛选过滤得到数值,代码如下:</p>
<ol>
<li>var str1 = "abc123cde"; </li>
<li>writeToLog(getDigitsOnly(str1));//返回123</li>
</ol>
<p align="left"><strong>获取Kettle环境变量的值(</strong><strong>getEnvironmentVar</strong><strong>)</strong></p>
<p align="left">获取在Kettle中的环境变量的值</p>
<ol>
<li>writeToLog(getEnvironmentVar("user.dir"));</li>
<li>writeToLog(getEnvironmentVar("user.name"));</li>
</ol>
<p align="left"><strong>获取当前进程的受影响行数(</strong><strong>getProcessCount(type)</strong><strong>)</strong></p>
<p align="left">根据类型获取当前进程的受影响行数,类型如下:</p>
<ul>
<li>u:更新行数</li>
<li>i:插入行数</li>
<li>w:写入行数</li>
<li>r:读取行数</li>
<li>o:输出行数</li>
</ul>
<ol>
<li>writeToLog(getProcessCount("u"));</li>
<li>writeToLog(getProcessCount("r"));</li>
</ol>
<p align="left"><strong>获取当前转换名称(</strong><strong>getTransformationName</strong><strong>)</strong></p>
<p align="left">获取当前的转换名称</p>
<ol>
<li>var xTranName = getTransformationName();</li>
<li>writeToLog(xTranName);</li>
</ol>
<p align="left"><strong>获取Kettle环境中的变量值(</strong><strong>getVariable</strong><strong>)</strong></p>
<p align="left">从当前的Kettle环境中获取指定的变量值,目前函数有2个重载:</p>
<ul>
<li>getVariable(varName);根据变量名称获取变量值</li>
<li>getVariable(varName,defaultValue):根据变量名获取值,如果不存在则使用默认值</li>
</ul>
<ol>
<li>var strVarName="getVariableTest";</li>
<li>var strVarValue="123456";</li>
<li>Alert(getVariable(strVarName, ""));</li>
<li>setVariable(strVarName,strVarValue, "r");</li>
<li>Alert(getVariable(strVarName, ""));</li>
<li>strVarValue="654321";</li>
<li>setVariable(strVarName,strVarValue, "r");</li>
<li>Alert(getVariable(strVarName, ""));</li>
</ol>
<p align="left"><strong>控制台打印(</strong><strong>println</strong><strong>)</strong></p>
<ol>
<li>var str = "Hello World!";</li>
<li>print(str);</li>
<li> </li>
</ol>
<p align="left"><strong>移除数值(</strong><strong>removeDigits</strong><strong>)</strong></p>
<p align="left">移除给定字符串中的数值,代码示例:</p>
<ol>
<li>var str1 = "abc123cde";</li>
<li> </li>
<li>writeToLog(removeDigits(str1));//返回abccde</li>
</ol>
<p align="left"><strong>发送邮件</strong></p>
<p align="left"><strong>设置环境变量(</strong><strong>setEnvironmentVar</strong><strong>)</strong></p>
<p align="left">通过在Script脚本组件中调用函数重新设置Kettle的环境变量</p>
<ol>
<li>var strVarName="setEnvTest";</li>
<li>var strVarValue="123456";</li>
<li>Alert(getEnvironmentVar(strVarName));</li>
<li>setEnvironmentVar(strVarName,strVarValue);</li>
<li>Alert(getEnvironmentVar(strVarName));</li>
<li>strVarValue="654321";</li>
<li>setEnvironmentVar(strVarName,strVarValue);</li>
<li>Alert(getEnvironmentVar(strVarName));</li>
</ol>
<p align="left"><strong>设置变量(</strong><strong>setVariable</strong><strong>)</strong></p>
<p align="left">通过setVariable函数设置环境变量,该用途可以用于重新赋值Kettle环境中已经存在的变量值或者重新生成变量值</p>
<p align="left">函数定义setVariable(key,value,level)</p>
<ul>
<li>key:变量名称</li>
<li>value:变量值</li>
<li>level:级别,主要包括s(system)、r(root)、p(parent)、g(grandparent)四种类别</li>
</ul>
<p align="left">代码示例如下:</p>
<ol>
<li>var strVarName="setEnvTest";</li>
<li>var strVarValue="123456";</li>
<li>Alert(getVariable(strVarName, ""));</li>
<li>setVariable(strVarName,strVarValue, "r");</li>
<li>Alert(getVariable(strVarName, ""));</li>
<li>strVarValue="654321";</li>
<li>setVariable(strVarName,strVarValue, "r");</li>
<li>Alert(getVariable(strVarName, ""));</li>
</ol>
<p align="left"><strong>写入日志(</strong><strong>writeToLog</strong><strong>)</strong></p>
<p align="left">打印并写入日志信息,该函数可能是我们用到的最多的函数,可以帮助我们调试信息,主要有两个重载:</p>
<ul>
<li>writeToLog(msg):写入msg日志信息</li>
<li>writeToLog(level,msg):根据level基本写入msg信息</li>
</ul>
<p align="left">关于日志的级别,这里主要是简写的方式,主要如下:</p>
<ul>
<li>d(Debug):调试模式</li>
<li>l(Detailed):详细</li>
<li>e(Error):错误</li>
<li>m(Minimal):最小日志</li>
<li>r(RowLevel):行级日志</li>
</ul>
<ol>
<li>writeToLog("Hello World!");</li>
<li>writeToLog("r", "Hello World!");</li>
</ol>
<p align="left"><strong>文件处理类函数(File Functions)</strong></p>
<p align="left"><strong>复制文件(</strong><strong>copyFile</strong><strong>)</strong></p>
<p align="left">复制一个文件到目标目录,函数定义如下:</p>
<p align="left">copyFile(sourceFile,targetFile,overwrite)</p>
<ul>
<li>sourceFile:源文件</li>
<li>targetFile:目标文件</li>
<li>overWrite:是否覆盖,如果目标文件存在的话,布尔类型</li>
</ul>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li> </li>
<li>var targetFile="F:/bak/logTarget.txt";</li>
<li> </li>
<li>copyFile(file1,targetFile,false)</li>
</ol>
<p align="left"><strong>创建文件夹(</strong><strong>createFolder</strong><strong>)</strong></p>
<p align="left">创建一个文件夹,代码示例如下:</p>
<ol>
<li>var strFolder = "F:/bak/createFolder";</li>
<li>createFolder(strFolder);</li>
</ol>
<p align="left"><strong>删除文件(</strong><strong>deleteFile</strong><strong>)</strong></p>
<p align="left">删除一个文件(不能删除文件夹)</p>
<ol>
<li>var targetFile="F:/bak/logTarget.txt";</li>
<li> </li>
<li>deleteFile(targetFile);</li>
</ol>
<p align="left"><strong>判断文件是否存在(</strong><strong>fileExists()</strong><strong>)</strong></p>
<p align="left">判断文件是否存在</p>
<ol>
<li>var targetFile="F:/bak/logTarget.txt";</li>
<li> </li>
<li>fileExists(targetFile);</li>
</ol>
<p align="left"><strong>获取文件扩展名(</strong><strong>getFileExtension</strong><strong>)</strong></p>
<p align="left">如果文件不存在,则返回null,代码示例</p>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li> </li>
<li>var ext=getFileExtension(file1);</li>
<li>writeToLog("扩展名:"+ext)</li>
</ol>
<p align="left"><strong>获取文件大小(</strong><strong>getFileSize</strong><strong>)</strong></p>
<p align="left">获取文件大小,结果是一个long类型的长整型数值</p>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li> </li>
<li>var ext=getFileSize(file1);</li>
<li>writeToLog("大小:"+ext)</li>
</ol>
<p align="left"><strong>获取文件最后修改日期(</strong><strong>getLastModifiedTime</strong><strong>)</strong></p>
<p align="left">获取文件最后修改日期,函数定义:</p>
<p align="left">getLastModifiedTime(filePath,format)</p>
<ul>
<li>filePath:文件路径</li>
<li>format:日期格式化</li>
</ul>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li> </li>
<li>var ext=getLastModifiedTime(file1,"yyyy-MM-dd HH:mm:ss");</li>
</ol>
<p align="left"><strong>获取文件的父文件夹名称(</strong><strong>getParentFoldername</strong><strong>)</strong></p>
<p align="left">获取文件的父文件夹名称</p>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li>var parentFolder=getParentFoldername(file1);</li>
</ol>
<p align="left"><strong>获取文件简称(</strong><strong>getShortName</strong><strong>)</strong></p>
<p align="left">获取文件简称</p>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li>var shortName=getShortFilename(file1);</li>
<li> </li>
<li>writeToLog("简单名称:"+shortName)//返回log.txt</li>
</ol>
<p align="left"><strong>判断是否是一个文件(</strong><strong>isFile</strong><strong>)</strong></p>
<p align="left">判断是否是一个文件</p>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li>var flag=isFile(file1) //true</li>
</ol>
<p align="left"><strong>判断是否是一个文件夹(</strong><strong>isFolder</strong><strong>)</strong></p>
<p align="left">判断是否是一个文件夹</p>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li>var flag=isFolder(file1) //false</li>
</ol>
<p align="left"><strong>加载一个文件的内容(</strong><strong>loadFileContent</strong><strong>)</strong></p>
<p align="left">从指定文件中加载内容,主要有两个重载函数:</p>
<ul>
<li>loadFileContent(filePath):默认加载文件</li>
<li>loadFileContent(filePath,encoding):指定编码加载文件内容</li>
</ul>
<p align="left">代码示例:</p>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li>var content=loadFileContent(file1);</li>
<li>var c1=loadFileContent(file1,"UTF-8")</li>
<li>writeToLog(content)</li>
</ol>
<p align="left"><strong>移动文件(</strong><strong>moveFile</strong><strong>)</strong></p>
<p align="left">移动指定文件,函数定义moveFile(source,target,overWrite)</p>
<ul>
<li>source:源文件</li>
<li>target:目标文件</li>
<li>overWrite;是否覆盖,如果目标文件存在,布尔类型值</li>
</ul>
<ol>
<li>var file1 = "F:/bak/log.txt";</li>
<li>var targetFile="F:/bak/logTarget.txt";</li>
<li> </li>
<li>moveFile(file1,targetFile,false)</li>
<li> </li>
</ol>
<p align="left"><strong>创建一个空文件(</strong><strong>touch</strong><strong>)</strong></p>
<p align="left">创建一个空文件</p>
<ol>
<li>var strFile = "F:/bak/log.txt";</li>
<li>touch(strFile);</li>
</ol>
<p align="left"><strong>总结</strong></p>
<p align="left">以上就是Kettle 8.3版本中的内置函数方法,方法很多,写这篇博客也是很累,算是全部都学习了一遍,脑子里已经记忆了一遍,但是我们也不需要死记硬背,就和我们学些Linux命令一样,如果你知道man命令,对某个命令不是很了解的话直接通过man命令学习即可.</p>
<p align="left">Kettle也是如此,对于某个函数不是很了解的话,右键点击该函数,会出现sample字样菜单,点击该菜单即可弹出该函数的介绍和使用信息,里面包含了该函数的调用示例和函数详细介绍,也是很人性化的.</p><br><br>
来源:https://www.cnblogs.com/qinyl/p/12158638.html
頁:
[1]