如何获取带SMCL标签字符串的显示长度并存储至Stata宏?
Stata:获取SMCL字符串显示后长度的方法
我有一段带SMCL格式标签的字符串,例如"{bf:{ul:opt}ion}({it:string})",实际显示时格式标签会被忽略,呈现为"option(string)",长度为14,但原字符串长度是29。需要通过编程获取显示后的文本长度并存入宏,要求不自行编写SMCL解析器,也不依赖SSC社区命令。
以下是我尝试过的代码及结果:
local str_smcl "{bf:{ul:opt}ion}({it:string})" local str_text "option(string)" * 显示带SMCL语法的字符串及其长度 display "`str_smcl'" display "`=strlen("`str_smcl'")'" // 返回29 * 显示不带SMCL语法的字符串及其长度 display "`str_text'" display "`=strlen("`str_text'")'" // 返回14 * 使用display宏函数 local str_text1 : display "`str_smcl'" display "`=strlen("`str_text1'")'" // 返回29 * Stata不接受该语法,尽管帮助文档说明display的特性可用于宏函数 //local str_text2 : display as smcl "`str_smcl'" * 可运行但未得到预期结果 local str_text3 : display _asis "`str_smcl'" display "`=strlen("`str_text3'")'" // 返回29
可行方案
利用临时文件将SMCL字符串转换为纯文本后计算长度,代码如下:
local str_smcl "{bf:{ul:opt}ion}({it:string})" * 创建临时文件 tempname tmp_handle file open `tmp_handle' using "`c(tmpdir)'smcl_clean.tmp", write text replace * 以_asis模式写入,自动去除SMCL格式标签 file write `tmp_handle' _asis "`str_smcl'" _n file close `tmp_handle' * 读取纯文本内容到宏 local clean_text : readfile "`c(tmpdir)'smcl_clean.tmp" * 移除可能存在的换行符 local clean_text = subinstr("`clean_text'", "`c(newline)'", "", .) * 计算长度并存储 local display_length = strlen("`clean_text'") * 验证输出 display "处理后的文本:`clean_text'" display "显示长度:`display_length'" // 输出14
说明
file write的_asis选项会自动解析SMCL标签,只写入实际显示的文本内容。通过临时文件中转后读取,就能得到去除格式后的纯文本,进而准确计算其长度。
内容的提问来源于stack exchange,提问作者TheIceBear
相关产品推荐
相关产品推荐

