It is possible, when using a File metadata, to transform the content of the file "on the fly" using javascript. The file will then be read differently by the mappings, processes, or when using a "consult data".
There are different ways to transform the file, either by using FILE scripting, LINE scripting, or both. When using both, the FILE scripting is applied before the LINE scripting.
Transformation File
This script will be applied to the whole file, and the file is read character by character.
The two objects we are going to use are input/output streams :
- __in__
This object contains the whole file content.
The method we are going to use is : read()
This method uses the file cursor and returns a char at the current position. If no char is found, returns -1.
- __out__
This object will contain the output for the transformed file.
The method we are going to use is : write(char)
It will append the char to the output.
Example of a simple file script that replaces every whitespace with an underscore :
i=0;
do{
i=__in__.read();
if (i>-1){
ch=String.fromCharCode(i);
if (ch==' ')
ch='_';
i=ch.charCodeAt();
__out__.write(i);
}
}while(i>-1);
Transformation Line
The script will be run for each line of the file.
The available objects are:
- __string__
It is used as a string in the script, we can use functions on it like on any other string.
In order to write the transformed output, just call the variable by its name.
- __position__
This is the number of the current original line.
Transformation Line Example #1: transforms everything in uppercase
__string__.toUpperCase();
Transformation Line Example #2: split a single line into several lines on the fly
Original file:
CUS_ID;ANSWER1;ANSWER2;ANSWER3
1;"Yes";"Not sure";"Probably"
2;"Never";;
Result:
CUS_ID;QUESTION_NO;ANSWER
1;1;"Yes"
1;2;"Not sure"
1;3;"Probably"
2;1;"Never"
Script (applied for each original line):
/* this array will hold the lines to be returned */
ret=new Array(); if (__position__==0){
/* header line is changed */
ret[0] = "CUS_ID;QUESTION_NO;ANSWER";
}else{
/* split data lines */
line = __string__.split(";");
lno = 0;
for (qno=1 ; qno<=3 ; qno++) {
if (line[qno]!="") {
ret[lno++] = line[0] + ";" + qno + ";" + line[qno];
}
}
}
/* return array */
ret;
File wizard for testing
In the metadata window, right click on the file -> actions -> Properties.
Language specified in the metadata
The scripting language (rhino/javascript) specified in the metadata has to be accepted by the java version of the production Runtime.
On the other hand, the wizard will work only if the java version of your designer accepts the specified language.