SAS中pipe语句字符串如何插入特殊字符(Unix迁移Linux场景)
解决方案
方法1:正确转义特殊字符适配Linux ls命令
你之前的写法报错核心原因是SAS宏处理器会优先解析%开头的标识符:
- 用
%str(%)的写法没有转义),导致%str(%)b实际输出为)b,才会出现返回结果里的)b )d异常 - 用双
%的写法,SAS解析完%%为%后,会把后续的%b/%d等当成宏尝试解析,导致时间格式乱码
可以用以下两种正确写法:
- 用
%nrstr标记%避免宏解析
Filename itt pipe "ls -l --time-style='+%nrstr(%%)b %nrstr(%%)d %nrstr(%%)T %nrstr(%%)Y' &mypath." ;
- 拆分字符串拼接(更简洁)
利用SAS单引号内不解析宏、相邻字符串自动拼接的特性,规避转义问题:
Filename itt pipe 'ls -l --time-style="+%b %d %T %Y" ' "&mypath." ;
注:单引号部分原样输出
%符号,双引号部分正常解析宏变量&mypath.,不会互相干扰。
方法2:跨平台原生SAS方案(更推荐)
完全不需要调用系统命令,用SAS内置的目录、文件属性读取函数实现相同需求,原生兼容所有SAS支持的操作系统,不需要针对Unix/Linux做适配,也不用手动解析ls命令的文本输出:
data file_list; length filename $256 perm $10 username groupname $32 modify_time 8 size 8; format modify_time datetime20.; /* 打开目标路径 */ dir_id = dopen("&mypath."); if dir_id = 0 then do; put "ERROR: 无法打开路径 &mypath."; stop; end; /* 遍历路径下所有文件 */ num_files = dnum(dir_id); do i = 1 to num_files; filename = dread(dir_id, i); /* 读取单个文件属性 */ file_id = mopen(dir_id, filename); if file_id > 0 then do; perm = finfo(file_id, "Access Permission"); username = finfo(file_id, "Owner Name"); groupname = finfo(file_id, "Group Name"); size = input(finfo(file_id, "File Size (bytes)"), best32.); modify_time = input(finfo(file_id, "Last Modified"), datetime20.); output; rc = fclose(file_id); end; end; rc = dclose(dir_id); drop dir_id num_files i file_id rc; run;
该方案输出的文件大小、修改时间都是SAS标准格式的变量,后续处理不需要额外转码、解析,稳定性更高。
内容的提问来源于stack exchange,提问作者CarLaTeX
相关产品推荐
相关产品推荐

