巧用UltraEdit脚本“造数据”

        造数据可能是日常开发测试中的一项常见工作。笔者当前的项目中需要对系统中的历史数据进行统计分析,由于项目处于初级阶段,数据量比较小,所谓的“历史”数据更是无从获取,于是就需要根据现有的数据编造一些数据来进行功能测试。

        造数据的工具可能有很多,我们甚至可以编写一个java程序直接用jdbc操作数据库,来批量生成数据。笔者使用的UltraEdit拥有强大的列操作功能,同时笔者还想挖掘一下其强大的脚本功能,于是着手写了一个js脚本。基本思想是:从数据库中导出现有数据的sql语句,用脚本找到其中需要替换的部分,乘以给定的系数作为新数据。

        首先是从数据库中导出现有的数据,例如笔者需要的数据表中有70条数据,导出的sql语句类似下列语句:

Insert into T_REPORTSYNTHESIS (REPORTCODE,ZONEID,STATISTICDATE,DEVNAME,REPORTDATA,DATAUNIT) values ('1','320200',to_timestamp('01-11月-13','DD-MON-RR HH.MI.SSXFF AM'),'011000',’1262’,null);
              这70条数据是2013年11月1日的数据,现在我们来模拟70条2012年11月1日的数据。利用UltraEdit的列模式,我们可以很方便地将这70条数据的年份改为2012年,在id(REPORTCODE)为一位的行id前面加上’10’,在id为两位的行id前面’1’,这就得到了id为101到170之间的新的70条数据。
        改变了数据的日期还不够,我们还需要修改各条数据的值(REPORTDATA列,上面sql语句标为黄色的部分)。这时候就轮到js脚本大显身手了:

var ln = parseInt( UltraEdit.getString("从哪一行开始?",1) );
var doc = UltraEdit.activeDocument;
doc.findReplace.regExp = true; // 开启正则表达式

UltraEdit.perlReOn();//启用正则表达式的perl模式
var whatToFind = "(?=.+')(\\d)+(\\.\\d+)?(?=',null)";

//doc.top();
doc.gotoLine(ln, 0);
//doc.write(UltraEdit.regexMode.toString());

var ratio = parseFloat( UltraEdit.getString("输入转换比率",1) );
while(doc.findReplace.find(whatToFind)) {
	var found = doc.selection;
	var whatToReplace = parseFloat(found)*ratio;
//	doc.write(ratio.toString());
	//很不人性化的一点:数字必须转化为字符串!
	doc.findReplace.replace(found,whatToReplace.toString());
}
              脚本里比较重要的是正则表达式,我们需要用一个正则表达式精确定位到待修改的数据列:
var whatToFind = "(?=.+')(\\d)+(\\.\\d+)?(?=',null)";

             这个正则表达式选择了前面是单引号,后面是“’,null”的一串数字(整数或浮点数)。其中用到了零宽度断言负向零宽度断言,关于正则表达式的技术细节,详见笔者的另一篇博文《正则表达式--笔记与实战(Eclipse文本替换)》。

        要在UltraEdit的脚本里启用这种复杂的正则表达式,需要启用正则表达式的perl模式:
UltraEdit.perlReOn();
              为了使用起来更方便,我们两次调用UltraEdit.getString,分别来动态获取要开始处理的起始行数,以及我们造数据使用的一个系数:我们将使用这个系数乘以现有的数据,例如乘以1.25,即可造出一批比现有数据大25%的新数据,let’s do it !

   

             我们将上文提到的那段代码保存为一个js文件,例如“reduceSelectedNumByPercent.js”,然后点击“脚本”菜单中的“脚本”项,添加这个脚本文件到菜单下方的列表,然后在需要运行脚本的编辑视图下,点击菜单下方的脚本项即可,现在,用这个文本编辑器尽情的造数据吧!造完之后,当然不要忘了在你的数据库客户端执行最终的Sql语句。

        利用脚本,我们可以直接在编辑器中,“可视化”地完成很多强大的功能,大家一起来挖掘吧。下面附上UltraEdit官方关于脚本的说明文档:




UltraEdit/UEStudio 的脚本通过嵌入 JavaScript 引擎启用。 这允许用户在享受完整 JavaScript 语言的强大和灵活的同时使用以下指定的命令与编辑器(应用程序对象命令),或在编辑器中打开的文档(文档对象命令)进行特别交互。 脚本可以在 UltraEdit/UEStudio 中编辑,在默认词语文件中带有内置 JavaScript 的语法加亮:


脚本引擎支持 JavaScript 1.7 的核心功能。 有关 JavaScript 的更多信息,请参考相关的 Mozilla 网站 (http://developer.mozilla.org/en/docs/JavaScript)。

例如,该脚本将生成一系列数字并将其写入活动的文档:

function recall(num) {
    UltraEdit.activeDocument.write(num + "\r\n");
}
function num() {
    var i = 0, j = 1, n = 0;
    while (n < 10) {
        recall(i);
        var t = i;
        i = j;
        j += t;
        n++;
    }
}
num();

更多演示脚本位于安装目录的“scripts”子目录下。要查看简短的脚本指南,请点击这里

在脚本中包含脚本

需要的话,用户可以在脚本中包含一个外部脚本,参考以下的方法:

// include externalScript.js

// include C:\full path\to external\script\externalScript.js

这个包含命令必须在前面加上行注记符。如果一个用户因调试的原因要排除这个包含的脚本,所包含的内容可以以两个行注记排除,如:

// // include externalScript.js

预设变量值

UltraEdit 支持一些变量值,当每次 UltraEdit 有脚本启动时它们会被初始化为预设值:

区块模式均为关闭。

十六进制模式均为关闭。

插入模式均为打开。

正则表达式引擎均设置为 Perl。

这些项会在每次运行一个脚本时被设置。

应用程序对象命令

UltraEdit 是全部 UltraEdit 操作所基于的应用程序对象。以下命令作用于编辑器而非活动文档。 除非注明其他参数,否则所有应用程序对象命令都必须使用下列格式调用:

UltraEdit.commandName();

下表说明了应用程序对象命令:

命令

参数*

说明

clearClipboard

 

清除活动的剪贴板。

clipboardContent

** 这是只读属性。

返回当前剪贴板内容。例如:

var clip = UltraEdit.clipboardContent;

clipboardIdx

** 这是只读属性。

返回当前剪贴板的索引。例如:

var clip = UltraEdit.clipboardIdx;

closeFile

文件路径

保存模式

0 - 提示保存

1 - 保存并关闭

2 - 关闭不保存

关闭活动的文件。例如:

UltraEdit.closeFile("C:\\temp\\test.txt",2);

*注意:在参数中使用的任何反斜线必须按以上显示进行换码(即使用“\\”而非“\”)。

columnMode

** 这是只读属性。

返回布尔值说明列模式是否活动。例如:

var columnActive = UltraEdit.columnMode;

columnModeOff

关闭列模式。例如:

UltraEdit.columnModeOff();

*注意:脚本处理完成后当前列模式状态将恢复。

columnModeOn

打开列模式。例如:

UltraEdit.columnModeOn();

decryptFilePrompt

显示解密文件对话框。 例如:

UltraEdit.decryptFilePrompt();

encryptFilePrompt

显示加密文件对话框。 例如:

UltraEdit.encryptFilePrompt();

frInFiles

.directoryStart 字符串 搜索开始的
完整路径
.filesToSearch 整数 值:

0 - 列出的文件
1 - 打开的文件
2 - 收藏的文件
3 - 项目文件
4 - 解决方案文件
.matchCase 布尔值 true/false
.matchWord 布尔值 true/false
.regExp 布尔值 true/false
.searchSubs 布尔值 true/false
.unicodeSearch 布尔值 true/false
.searchInFilesTypes 字符串 搜索的文件/类型

范围
.find ("要搜索的字符串");
.replace ("要搜索的字符串", "替换字符串");

** 仅在替换中使用 **
.logChanges 布尔值 true/false
.preserveCase 布尔值 true/false

** 仅无法在替换中使用 **
.useOutputWindow 布尔值 true/false

在指定的文件中搜索,基于指定的参数查找引号 "" 中的字符串。

在文件中查找示例:

UltraEdit.frInFiles.directoryStart = "c:\\temp\\";

UltraEdit.frInFiles.searchInFilesTypes = "*.txt";

UltraEdit.frInFiles.useOutputWindow = true;

UltraEdit.frInFiles.find("3939");

在文件中替换示例:

UltraEdit.frInFiles.directoryStart = "c:\\temp\\";

UltraEdit.frInFiles.searchInFilesTypes = "*.txt";

UltraEdit.frInFiles.useOutputWindow = true;

UltraEdit.frInFiles.replace("3939", "7878");

getString

在提示对话框中使用的引号 ("") 中的字符串

可选参数:

0 int

1 int 返回值

提示用户在当前位置插入的字符串。 “提示”是指脚本运行时显示给用户的提示或问题。例如:

UltraEdit.getString("What is your name?");

var str = UltraEdit.getString("What is your name?",1);

如果使用 int 值“1”,则输入的字符串将不会写入活动文件,但会另存为变量值并在运行的脚本中使用。

getValue

在提示对话框中使用的引号 ("") 中的字符串

可选参数:

0 int

1 int 返回值

提示用户在当前位置插入的值。 “提示”是指脚本运行时显示给用户的提示或问题。例如:

UltraEdit.getValue("How old are you?");

var str = UltraEdit.getValue("How old are you?",1);

如果使用 int 值“1”,则输入的字符串将不会写入活动文件,但会另存为变量 int 值并在运行的脚本中使用。

insertMode

更改文本编辑模式中的字符输入为插入模式。

insOvrMode

** 这是只读属性。

返回布尔值说明插入模式是否打开。例如:

var insertActive = UltraEdit.insOvrMode;

messageBox

消息文本位于引号 ("") 中

标题文本位于引号 ("") 中(可选)

显示带有“确定”按钮的消息对话框。例如:

UltraEdit.messageBox("Can't complete process", "Process Abort");

newFile

打开新的空白文件。

open

文件名在引号("")中

打开指定的文件。文件名必须在引号中。可以使用“^c”且 UltraEdit 会将其替换为剪贴板中的内容。例如:

UltraEdit.open("c:\

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值