Type : MIXTE
Les actions définies par l'utilisateur traitent des tables CAS existantes dont les noms et les caslibs sont passés en paramètres (par exemple, 'caslib' et 'table'). Le script ne crée pas de données source brutes, mais il génère des tables temporaires dans CAS pour ses calculs intermédiaires. La CASLIB 'UDAS' est créée pour stocker les définitions des actions elles-mêmes, et non pour stocker des données d'entrée au sens traditionnel. Le code commenté suggère l'utilisation de tables comme 'baseball' qui sont supposées exister dans CAS.
| 1 | cas; |
| 2 | caslib _all_ assign; |
| 3 | /* Orginal code authored by Chris Ricciardi */ |
| 4 | /* TB, compressedKB,compressedMB,compressedGB,compressedTB added by Steven Sober */ |
| 5 | /* You must modify the path in the CASLIB USDA at the bottom of the code */ |
| 6 | |
| 7 | PROC CAS; |
| 8 | BUILTINS.defineActionSet / |
| 9 | name="tableSizeHuman" |
| 10 | actions={ |
| 11 | { |
| 12 | name="tableStats" |
| 13 | desc="Multiple Table actions with calculation of CAS table size and datatype frequency count" |
| 14 | parms={ |
| 15 | {name="caslib" type="string" required=TRUE} |
| 16 | {name="table" type="string" required=TRUE} |
| 17 | {name="level" type="string" required=FALSE default="sum"} |
| 18 | } |
| 19 | definition = " |
| 20 | table.tableInfo result=r status=s / |
| 21 | caslib=caslib |
| 22 | name=table; |
| 23 | if 0 != s.severity then do; |
| 24 | send_response(s); |
| 25 | end; |
| 26 | send_response(r); |
| 27 | run; |
| 28 | |
| 29 | table.tableDetails result=r status=s / |
| 30 | caslib=caslib |
| 31 | name=table |
| 32 | level=level; |
| 33 | if 0 != s.severity then do; |
| 34 | send_response(s); |
| 35 | end; |
| 36 | send_response(r); |
| 37 | run; |
| 38 | |
| 39 | details = findTable(r); |
| 40 | saveresult details caslib=caslib casout='casdatasize' replace; |
| 41 | |
| 42 | table.fetch result=r status=s / |
| 43 | table={caslib=caslib name='casdatasize' |
| 44 | computedVars={name='KB',name='MB',name='GB',name='TB', |
| 45 | name='compressedKB',name='compressedMB',name='compressedGB',name='compressedTB'} |
| 46 | computedVarsProgram=' |
| 47 | KB=round(DataSize / (1024),0.01); |
| 48 | MB=round(DataSize / (1024*1024),0.01); |
| 49 | GB=round(DataSize / (1024*1024*1024),0.01); |
| 50 | TB=round(DataSize / (1024*1024*1024*1024),0.01); |
| 51 | compressedKB=round(CompressedSize / (1024),0.01); |
| 52 | compressedMB=round(CompressedSize / (1024*1024),0.01); |
| 53 | compressedGB=round(CompressedSize / (1024*1024*1024),0.01); |
| 54 | compressedTB=round(CompressedSize / (1024*1024*1024*1024),0.01); |
| 55 | '} |
| 56 | fetchVars={'DataSize', 'VardataSize', 'KB', 'MB', 'GB', 'TB', |
| 57 | 'CompressedSize', 'compressedKB', 'compressedMB', 'compressedGB', 'compressedTB'}; |
| 58 | |
| 59 | if 0 != s.severity then do; |
| 60 | send_response(s); |
| 61 | end; |
| 62 | send_response(r); |
| 63 | run; |
| 64 | |
| 65 | /*size = round((details[1,6] + details[1,7]) / (1024*1024),0.01); |
| 66 | print (string)size || 'MB'; |
| 67 | run;*/ |
| 68 | |
| 69 | table.columnInfo result=r status=s / |
| 70 | table={caslib=caslib name=table}; |
| 71 | if 0 != s.severity then do; |
| 72 | send_response(s); |
| 73 | end; |
| 74 | send_response(r); |
| 75 | run; |
| 76 | |
| 77 | columns = findTable(r); |
| 78 | saveresult columns caslib=caslib casout='cascolumns' replace; |
| 79 | |
| 80 | simple.freq result=r status=s / |
| 81 | table={caslib=caslib name='cascolumns'} |
| 82 | inputs={{name='type'}}; |
| 83 | if 0 != s.severity then do; |
| 84 | send_response(s); |
| 85 | end; |
| 86 | send_response(r); |
| 87 | run; |
| 88 | " |
| 89 | }, |
| 90 | { |
| 91 | name="profCols" |
| 92 | desc="Profile selected columns" |
| 93 | parms={ |
| 94 | {name="caslib" type="string" required=TRUE} |
| 95 | {name="table" type="string" required=TRUE} |
| 96 | {name="col" type="string" unkeyedList=TRUE required=TRUE} |
| 97 | } |
| 98 | definition = " |
| 99 | dataDiscovery.profile result=r status=s / |
| 100 | table={name=table, caslib=caslib}, |
| 101 | casOut={caslib=caslib, name='profcols', replication=0, replace=True}, |
| 102 | columns=col, |
| 103 | frequencies=2, |
| 104 | minmax=2; |
| 105 | if 0 != s.severity then do; |
| 106 | send_response(s); |
| 107 | end; |
| 108 | send_response(r); |
| 109 | " |
| 110 | }, |
| 111 | { |
| 112 | name="imageMelt" |
| 113 | desc="Combine image processing detections with cropped images" |
| 114 | parms={ |
| 115 | {name="caslib" type="string" required=TRUE} |
| 116 | {name="detections" type="string" required=TRUE} |
| 117 | {name="cropped" type="string" required=TRUE} |
| 118 | {name="casout" type="string" required=TRUE} |
| 119 | } |
| 120 | definition = " |
| 121 | table.columnInfo result=r / |
| 122 | table={name=detections caslib=caslib}; |
| 123 | col_info = findTable(r); |
| 124 | varlist = {}; |
| 125 | do colname over col_info; |
| 126 | if length(colname.Column) ge 7 then do; |
| 127 | obj = substr(colname.Column,1,7); |
| 128 | end; |
| 129 | if obj = '_Object' then do; |
| 130 | tempVar=colname.Column; |
| 131 | varlist = varlist + {tempVar}; |
| 132 | end; |
| 133 | end; |
| 134 | run; |
| 135 | |
| 136 | /*print varlist; |
| 137 | run;*/ |
| 138 | |
| 139 | transpose.transpose / table ={name=detections caslib=caslib groupBy = {'_id_', '_filename_0', '_nObjects_'} |
| 140 | computedVars={name='idvalue'} |
| 141 | computedVarsProgram='idvalue=""Values""'} |
| 142 | casout = {name='obj_melted' caslib=caslib replace=true replication=0} |
| 143 | id = {'idvalue'} |
| 144 | let = 0 |
| 145 | transpose = varlist |
| 146 | name = 'ColName'; |
| 147 | run; |
| 148 | |
| 149 | transpose.transpose / table={name='obj_melted' caslib=caslib groupby={'_id_', 'object', '_filename_0', '_nObjects_'} |
| 150 | computedVars={{name='object'},{name='type'}} |
| 151 | computedVarsProgram=""object=substr(ColName,8,(index(substr(ColName,2),'_')-7)); |
| 152 | if type = substr(ColName,(index(substr(ColName,2),'_')+2)) = '' |
| 153 | then type = 'objname'; |
| 154 | else type = substr(ColName,(index(substr(ColName,2),'_')+2));""} |
| 155 | casout={name='obj_melted2' caslib=caslib replace=true replication=0} |
| 156 | id={'type'} |
| 157 | transpose = {'Values'} |
| 158 | let = False; |
| 159 | run; |
| 160 | |
| 161 | table.tableInfo result=r / |
| 162 | name=cropped; |
| 163 | tinfo = findTable(r); |
| 164 | crop = tinfo[1,1]; |
| 165 | /*print 'crop is ' crop;*/ |
| 166 | clib = tinfo[1,18]; |
| 167 | /*print 'clib is ' clib;*/ |
| 168 | run; |
| 169 | |
| 170 | qstring = 'create TABLE ' || clib || '.' || casout || ' {options replace=true replication=0} as select |
| 171 | t1.*, t2._filename_0, t2._nObjects_, /*cast(t2.object as double) as object,*/ t2.objname, |
| 172 | cast(t2.height as double) as height, cast(t2.width as double) as width, |
| 173 | cast(t2.x as double) as x, cast(t2.y as double) as y |
| 174 | from ' || clib || '.' || crop || ' t1 left join ' || clib || '.obj_melted2 t2 |
| 175 | on (t1._parentId_ = t2._id_ and t1._id_ = cast(t2.object as double))'; |
| 176 | /*print qstring;*/ |
| 177 | run; |
| 178 | |
| 179 | fedsql.execdirect / |
| 180 | query=qstring; |
| 181 | run; |
| 182 | |
| 183 | table.tableInfo result=r status=s / |
| 184 | caslib=caslib |
| 185 | name='obj_joined'; |
| 186 | if 0 != s.severity then do; |
| 187 | send_response(s); |
| 188 | end; |
| 189 | send_response(r); |
| 190 | run; |
| 191 | |
| 192 | table.dropTable / caslib=caslib name='obj_melted'; |
| 193 | run; |
| 194 | table.dropTable / caslib=caslib name='obj_melted2'; |
| 195 | run; |
| 196 | " |
| 197 | } |
| 198 | } |
| 199 | ; |
| 200 | RUN; |
| 201 | QUIT; |

| 1 | PROC CAS; |
| 2 | TABLE.addCaslib / |
| 3 | caslib='UDAS' |
| 4 | dataSource={srctype='path'} |
| 5 | path="/viyafiles/sasss1/userDefinedActionSets"; |
| 6 | RUN; |
| 7 | QUIT; |
| 8 | |
| 9 | PROC CAS; |
| 10 | BUILTINS.actionSetToTable / |
| 11 | actionSet="tableSizeHuman" |
| 12 | casOut={caslib="UDAS" name="tableSizeHuman" replace=True}; |
| 13 | RUN; |
| 14 | TABLE.save / |
| 15 | caslib="UDAS" |
| 16 | TABLE="tableSizeHuman" |
| 17 | name="tableSizeHuman.sashdat" |
| 18 | replace=True; |
| 19 | QUIT; |