FAQ > 金融建模 > 建模问题 > 数组操作

Q:一维数组和二维数组的转化    

  • A:
    1)一维数组是只有一列且没有列标的数组,比如 array(1,2,3,4),在使用TS-SQL方式取数据时,列用thisrow表示。比如

    //取出a数组中小于等于3的值
      a:=array(1,2,3,4,5);
    //用sselect取出的结果仍为一维数组
      return sselect thisrow from a where thisrow<=3 end;

    直接取某行值时,只需指定行,不需指定列。比如取第3行的数据(数组的自然行下标从0开始,第3行对应的行标是2),用a[2]。
    一维数组转化为二维数组,可以用select的方式,也可以用转置的方式:

    //用select的方式,需用as给出列名,否则默认列名为"Expr1"
      a:=array(1,2,3,4,5);
      return select thisrow as 'data' from a end;


    //用转置的方式,列名默认为0,如果要修改列名,可用select方式或reindex等方式。
      a:=array(1,2,3,4,5);
      return `a;


    2)二维数组有一列或多列,每列有列标。在使用TS-SQL方式取数据时,需指定列名,或用*表示取所有列。如:

    //取数组r中data列小于等于3的所有数据
      r:=array(("time":20170201T,"data":1),
          ("time":20170202T,"data":2),
          ("time":20170203T,"data":3),
          ("time":20170204T,"data":4),
          ("time":20170205T,"data":5));
      return select * from r where ['data']<=3 end;

    直接用数组的方式取指定行指定列时,需指定行列名,如r[2]['data']。
    从二维数组取一维数组时,可以用sselect的方式,或直接用数组符号的方式。比如:

    //用sselect的方式取data列的数据
      r:=array(("time":20170201T,"data":1),
          ("time":20170202T,"data":2),
          ("time":20170203T,"data":3),
          ("time":20170204T,"data":4),
          ("time":20170205T,"data":5));
      return sselect ['data'] from r end;



    //用数组符号的方式取data列数据
      r:=array(("time":20170201T,"data":1),
          ("time":20170202T,"data":2),
          ("time":20170203T,"data":3),
          ("time":20170204T,"data":4),
          ("time":20170205T,"data":5));
      return r[:,'data'];