Java provides only the most basic data
import functions like specifying separators. But other common functions, such
as importing specified columns by column names, specifying the order of columns
and data types and that no separator should be used, need to be realized
manually. Though they are not difficult to realize, the code is complicated and
easy to get wrong.
But if esProc is used to help Java in
developing the program, the problems will be dealt with without writing code
manually. The following example will teach you how esProc works.
Here is a text file data.txt with tab being
the separator and 30 columns. The first row of the file is the column names of
business significance. It is required to import the following columns by column
names: ID, x1Shift, x2Shift and ratio, and compute a new column - value - using
the business formula "((x1Shift+x2Shift)/2)*ratio". The first rows and columns
of the file are as follows:
To solve the problem in Java, we must sort
out all the 30 columns, quote specified columns with subscripts and then
perform the computation. If too many formulas are involved, the computation
will become rather complicated and easy to get wrong. In order to reduce the
error probability, we have to store each piece of data in an object and give
each field a business name according to which the formula is computed.
A1: import function is used to import the file, not all the 30 columns though. It will import the specified columns by column names instead. Parameter option @t means importing the first row of the file as the column names. The computed result of this step is as follows:
A2: Perform computation directly according to the business names. The result is as follows:
In practice, sometimes the above result needs to be exported to a file. The code for this is =file("E:\\result.txt").export@t(A2.new(ID,value)). It means writing the two columns: ID and value, to the file result.txt. The content of the file is as follows:
If the
computed result needs to be returned to Java for further use, we only need to
write code in esProc like this, result
A2.new(ID,value)), which means returning
the columns ID and result to Java through JDBC interface, with a data type of resultSet. Then the result can be
obtained by calling esProc script in Java through JDBC. The code is as follows:
//create a connection using esProc jdbc
Class.forName("com.esproc.jdbc.InternalDriver");
con=
DriverManager.getConnection("jdbc:esproc:local://");
//call the esProc script file whose
name is test
st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call
test()");
st.execute();//execute esProc stored
procedure
ResultSet set = st.getResultSet(); // get the result set
Sometimes
the order of columns needs to be specified in order to manipulate data visually
while data is imported. For example, import data from the same file data.txt according to a new order of the
specified fields: x1Shift, x2Shift, radio and ID. esProc can specify the order
automatically, and the code can be written as this:
=file("E:\\data.txt").import@t(xShift,yShift,ratio,ID)
In the above code, esProc can set suitable data type automatically. For example, xShift and yShift will be set as float. But sometimes we need to specify the data types. For example, the data in ID is similar to integer but actually it is the string. If the first four characters of ID are to be imported separately, esProc will execute the following code:
A1: Convert the data type of column ID by specially importing it as strings. The result is as follows:
Note: It
is a rule that strings are left justified and numbers are right justified in
esProc's IDE, as shown in the above figure.
A2: Select the first four characters and the result is as follows:
During data import, sometimes there is not a separator. For example, data2.txt has 20 columns and part of the data is as follows:
It can be seen that there is no column separator in data2.txt and some data is just useless blank row. But esProc can import data correctly through executing the following code:
A1: Import the data as a single-column table sequence with the column name being "_1" by default. The function option @s means the field will be imported directly without being split. The result is as follows:
A2: A1.select(trim(_1)!="") is to select the non-blank rows. select function can make query by field name or row numbers. The result is as follows:
A3:=A2.new(mid(_1,1,1),mid(_1,2,1),mid(_1,3,1),mid(_1,4,1),mid(_1,5,1),mid(_1,6,1),
mid(_1,7,1),mid(_1,8,1),mid(_1,9,1),mid(_1,10,1),mid(_1,11,1),mid(_1,12,1),mid(_1,13,1),mid(_1,14,1),mid(_1,15,1),mid(_1,16,1),mid(_1,17,1),mid(_1,18,1),mid(_1,19,1),mid(_1,20,1))
This long line of code is to split each row of data into 20 fields. mid function has three parameters: the name of field to be split, starting and ending positions and the length of each split field. The result after splitting is as follows:
A3 shows
the needed result.
But the long
code in A3 is inconvenient for checking and maintenance. We can simplify it
using esProc's dynamic code as follows:
A4:=20.loops(~~+"mid(_1," + string(~) +
",1),")
A5:=exp=left(A4,len(A4)-1)
A6:=eval("A2.new("+ A5+")")
loops function in A4 is
used to perform loop computation and generate a regular string, that is, "mid(_1,1,1),mid(_1,2,1),mid(_1,3,1),mid(_1,4,1),mid(_1,5,1),mid(_1,6,1),mid(_1,7,1),mid(_1,8,1),mid(_1,9,1),mid(_1,10,1),mid(_1,11,1),mid(_1,12,1),mid(_1,13,1),mid(_1,14,1),mid(_1,15,1),mid(_1,16,1),mid(_1,17,1),mid(_1,18,1),mid(_1,19,1),mid(_1,20,1),"
Notice
that there is a redundant comma at the end of the string, which can be removed
using the code in A5.
A6:Execute the dynamic script. eval function can parse the string dynamically to an expression. For example, eval("2+3") equals expression 2+3, whose value is 5. So actually the role of expression in A5 equals that of the code in A3 and their computed results are identical: