SAS9新体验-在DATA STEP中使用JAVA对象


简介
DSCI提供建立和处理组件对象在DATA STEP程序中,JAVAOBJ就是这样的一个对象,其提供类似JNI的机制,可实例化JAVA 类,访问对象属性和方法

定义JAVA对象
其由DECLARE语法支持:
 declare javaobj j("类名");
这样将定义和存储一个对象的实例在标量J中, JAVAOBJ会将JAVA CLASSPATH下的someJavaClass实例化呈现出来
典型的,为确保实例化J只一次,可以这样做
   if _N_ = 1 then do;
     declare javaobj j("someJavaClass");
   end;
JAVAOBJ也能使用_new_ 语法进行实例化
     declare javaobj j;
     j = _NEW_ javaobj("someJavaClass");


构造参数

JAVAOBJ构造一个对象的实例的第一个参数是JAVA类的名字,如建立一个hashtable对象
 declare javaobj h("java/util/Hashtable");
其他相应的参数也可以依次传给java class本身
如建立一个容量为100、系数为0.8的hashtable对象,我们应该封装java/util/Hashtable类且在DATA STEP中实例化它
    import java.util.*;

    public class mhash extends Hashtable
    {
      mhash(double size, double load)
       {
         super((int)size, (float)load);
       }
    }

 declare javaobj h("mhash", 100, .8);
 
 封装类是必须的,因为DATA STEP中的数字类型对应JAVA中的double
 

访问对象属性
一旦对象被实例化,JAVAOBJ是容许用户用方法访问和修改对象属性,如设想我们由这样一个类
import java.util.*;
import java.lang.*;
public class ttest
{
  public int    i;
  public double d;
  public String s;
}
我们建立这个类的实例,用set/get访问对象属性在下列程序中
data _null_;
 dcl javaobj j("ttest");
 length val 8;
 length str $20;
 j.setIntField("i", 100);
 j.setDoubleField("d", 3.14159);
 j.setStringField("s", "abc");

 j.getIntField("i", val);
 put val=;
 j.getDoubleField("d", val);
 put val=;
 j.getStringField("s", str);
 put str=;
 run;

set/get方法的第一个参数是属性名,第二个参数是get/set的变量或值

 

访问对象方法
可以把上面的类改造成这样
import java.util.*;
import java.lang.*;
public class ttest
{
  public int    i;
  public double d;
  public String s;

  public int im()
  {
    return i;
  }

  public String sm()
  {
    return s;
  }

  public double dm()
  {
    return d;
  }
}
我们可以通过javaobj方法调用访问java 值,如
data _null_;
 dcl javaobj j("ttest");
 length val 8;
 length str $20;
 j.setIntField("i", 100);
 j.setDoubleField("d", 3.14159);
 j.setStringField("s", "abc");

 j.callIntMethod("im", val);
 put val=;
 j.callDoubleMethod("dm", val);
 put val=;
 j.callStringMethod("sm", str);
 put str=;
 run;

注:方法的返回值总是被指定为最后一个参数,例如,我们有个返回为double的方法
    public double m(double x, double y)
      {
         return x * y;
      }
那么在DATA STEP中调用该方法用下列语法
    length val1 val2 ret 8;
    j.callDoubleMethod("m", val1, val2, ret);


访问类的属性和方法
访问类的静态属性和方法,我们可以使用相应的JAVAOBJ方法,例如
import java.util.*;
import java.lang.*;
public class ttestc
{
  public static double d;
  public static double dm()
  {
    return d;
  }
}
在DATA STEP中调用
data x;
 dcl javaobj j("ttestc");
 length d 8;

 j.callSetStaticDoubleField("d", 3.14159);
 j.callStaticDoubleMethod("dm", d);
 put d=;
 run;


数据类型使用

java数据类型集是data step的超集,后者的主要类型是数字型和字符型,而JAVA除了包含数字型和字符型还含有如byte,char,short等类型
当使用javaobj方法调用是所有java数字类型对应DATA STEP中的数组类型,JAVA STRING则映射到DATA STEP的字符类型(为UTF串),字符型不能被映射到data step中,且不能由java clasS返回对象到data step中(string对象除外),但是容许传送对象到java class中

某些JAVA类返回对象,我们可以封装改类以获得对象的值,例如

import java.util.*;

public class mhash
{
  private Hashtable table;

  public mhash()
  {
    table = new Hashtable();
  }

  public void put(double key, double value)
    {
      table.put(new Double(key), new Double(value));
    }

  public void put(String key, String value)
  {
    table.put(key, value);
  }

  public double get(double key)
    {
      Object ret = table.get(new Double(key));
      if (ret instanceof Double)
        return ((Double)ret).doubleValue();
      else
        return Double.NaN;
    }

  public String get(String key)
  {
    return (String)table.get(key);
  }
}


data step中使用
data _null_;
   length s $20;

   /*
    * Simple Java hash table test.  mhash.class is a wrapper
    * for java/util/Hashtable - so that we can pass Java strings
    * directly instead of generic Objects.
    */
   declare javaobj h("mhash");

   /* Load up the table */
   h.callVoidMethod("put", "key1", "data1");
   h.callVoidMethod("put", "key2", "data2");
   h.callVoidMethod("put", "key3", "data3");
   h.callVoidMethod("put", "key4", "data4");
   h.callVoidMethod("put", "key5", "data5");

   /* Retrieve a value */
   h.callStringMethod("get", "key3", s);
   put s=;
   run;


   

 

数组使用
data step数组能直接传到java对象中,如
import java.util.*;
import java.lang.*;
class jtest
{
  public void dbl(double args[])
  {
     for(int i = 0; i < args.length; i++)
      System.out.println(args[i]);
  }

  public void str(String args[])
  {
     for(int i = 0; i < args.length; i++)
      System.out.println(args[i]);
  }
}

data _null_;
  dcl javaobj j("jtest");
  array s[3] $20 ("abc", "def", "ghi");
  array d[10] (1:10);
  j.callVoidMethod("dbl", d);
  j.callVoidMethod("str", s);
  run;

 

 


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SASdata语句用于创建或修改一个数据集。以下是data语句的使用规则: 1. data语句必须以data关键字开头,后跟数据集的名称。数据集名称必须是1-32个字符的有效SAS名称。 2. 可以用“set”关键字指定要使用的现有数据集,语法如下: data new_dataset; set existing_dataset; run; 3. 可以使用“keep”和“drop”关键字指定要保留或删除的变量,语法如下: data new_dataset; set existing_dataset; keep var1 var2; /* 保留var1和var2变量 */ drop var3; /* 删除var3变量 */ run; 4. 可以在data语句使用多个数据集,并在数据步骤进行合并。例如: data new_dataset; set existing_dataset1 existing_dataset2; run; 5. 在data语句,可以使用if-then或do-end语句选择或过滤数据。例如: data new_dataset; set existing_dataset; if var1 = 'Yes' then var2 = 'New Value'; /* 当var1等于Yes时,将var2的值更改为New Value */ if var3 < 10 then delete; /* 当var3小于10时,删除该记录 */ run; 6. 数据集创建或修改的内容必须在run语句指定。在run语句之后,SAS会读取数据集并执行相应的操作。 7. 如果数据集不存在,则SAS将创建一个新的数据集。如果数据集存在,则SAS将覆盖现有数据集。因此,在执行data语句之前,请确保备份现有数据集。 总之,data语句是在SAS创建和修改数据集的基本语句,可以根据需要使用其他关键字和语句对数据进行处理和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值