SAS学习笔记3: proc format & format

目录

proc format

value

pricture

format与dataset之间的相互转换

dataset转换为format

 format格式转为dataset

format



  • proc format

proc format 常用于自定义格式。常见以下三种使用方式:

  1. value
  2. picture
  3. format和dataset之间转换

value

语法:

proc format;

        value <format-name/$format-name>

                'origin-value'='new-value'

                 ;

quit;

示例如下:

proc format library=work;
	value $sex
		'F'='女'
		'M'='男'
	;
quit;

data test1;
	set sashelp.class;
	format sex_new $sex.;
	sex_new=sex;
run;
	

 调用后生成的sex_new列并未改变原始值F/M,仅在展示时,显示为女/男。如下:

data test1;
	set sashelp.class;
	format sex_new $sex.;
	sex_new=sex;
	sex_new_=sex_new;
run;

 

 Tips: 使用value定义格式时常用规则:

  1. 字符型:需要使用单引号''。(不可使用双引号"")。
  2. low:对于数值型变量,使用low来代指变量最小值。
  3. high: 对于数值型变量,使用high来代指变量最大值。
  4. low-high:指变量全部取值范围。
  5. other:代指所列取值以外的范围。

pricture

语法:

proc format:

        pricture <format-name>

                'origin-value'='new-value'

        ;

quit;

示例如下:

data format_A;
	input id;
	datalines;
	12345678910
	24681024754
	25474983754
	;
run;

/*将转为000-0000-000电话号码格式*/
proc format;
	picture phone_number
	low-high='000-0000-0000'
	;
run;
/*将$00,000,000,000计数格式,并且显示乘以2*/
proc format;
	picture symbol
	low-high='00,000,000,000'(prefix='$' mult=2)
	;
run;

data test;
	set format_A;
	format id_1 phone_number. id_2 symbol15. ;
	id_1=id;
	id_2=id;
run;

 与value相同,上述format均不改变原始数据id值,id_1=id,id_2=id。

  • format与dataset之间的相互转换

dataset转换为format

data format;
    input id $5. group $8.;
    datalines;
1     group1
2     group2
3     group3
4     group4
other       
;
run;

data fmt(keep=fmtname start label);
    set format;
    retain fmtname '$group'; /*group前标注$,表明为字符型*/
    rename id=start group=label;
run;

proc format cntlin=fmt;
quit;

cntlin选项用法可见:proc format cntlin=XXX - 简书

 format格式转为dataset

proc format;
	value $id
	'1'='group1'
	'2'='group2'
	'3'='group3'
	'4'='group4'
	other=''
;
quit;

proc format 
	library=work 
	cntlout=id_output(where=(fmtname='ID'));
quit;
/*'ID'必须为大写,字符型前无需添加$*/
  • format

    在SAS DATA步添加一个新变量时,该变量长度会在第一次赋值时定义,后续变量赋值长度超过首次赋值长度时,会自动截断,导致结果显示不全。如下:

data test;
	set sashelp.class;
	if index(name,'A')>0 then comments='A';
	else comments='名字中不含字母A';
run;

上述comments变量首次赋值时,长度为1。else语句中变量赋值长度超过1,导致截断,结果显示为空。

 使用length语句,或format语句可避免上述问题。

data test;
	set sashelp.class;
	format comments $50.;
	if index(name,'A')>0 then comments='A';
	else comments='名字中不含字母A';
run;

 

 

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据错误信息来看,你尝试使用 `Dahua::Manager::IConfigManager::Proc()` 函数来注册一个成员函数作为回调函数。然而,编译器报告没有找到匹配的函数调用,这可能是因为参数类型不匹配导致的。 根据错误信息,你正在尝试将 `CPageDesktop::onConfigLocalSmartMotionDetect` 作为回调函数,它的类型似乎是 `void (CPageDesktop::*)()`。然而,`Dahua::Manager::IConfigManager::Proc()` 函数的参数类型是 `void (*)(const Json::Value&, int&)`,即一个普通函数指针。 为了解决这个问题,你需要使用适当的转换来将成员函数指针转换为普通函数指针。通常,可以使用一个静态的中间函数来作为转发函数。以下是一个示例: ```cpp class CPageDesktop { public: static void onConfigLocalSmartMotionDetectWrapper(const Json::Value& value, int& result) { CPageDesktop* instance = reinterpret_cast<CPageDesktop*>(value.asInt64()); instance->onConfigLocalSmartMotionDetect(); } void onConfigLocalSmartMotionDetect() { // 实现逻辑 } void registerCallback() { Dahua::Manager::IConfigManager::Proc(&CPageDesktop::onConfigLocalSmartMotionDetectWrapper, reinterpret_cast<int64_t>(this)); } }; ``` 在上述代码中,我们创建了一个名为 `onConfigLocalSmartMotionDetectWrapper` 的静态中间函数。这个函数会将 `CPageDesktop` 类的实例指针传递给成员函数 `onConfigLocalSmartMotionDetect()` 进行调用。 然后,在 `registerCallback()` 函数中,我们使用 `onConfigLocalSmartMotionDetectWrapper` 作为回调函数进行注册,同时使用 `reinterpret_cast` 将 `this` 指针转换为整数类型的参数传递给中间函数。 通过这种方式,你可以将成员函数指针转换为普通函数指针,并成功注册为回调函数。请根据你的实际情况进行调整和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值