You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:51:03