Stata:处理包含受保护字符的变量标签
Stata: handling variable label containing protected character
我正在处理大约一百个从 SPSS 文件导入的 Stata 数据文件,我无法再访问这些文件。在构建跨所有文件的摘要描述时,我记录了变量和值标签,其中包括如下循环:
foreach v of varlist _all {
local varlbl: variable label `v'
// do some more things
file write `outfile' `"`v'"' // and some other stuff
}
这几乎一直都很好,额外的反引号和单引号正确地转义了更常见的半问题内容,例如变量标签中的内联引号。
打破它的是这样的标签:
BC9C str1 %-1s BC9C See/hear ACT: `Newspaper
此处无法处理 Newspaper
之前的行内反引号。我尝试了以下方法来处理这个问题,除了#5 彼此之间存在细微差别:
删除违规字符(失败 w/ 'too few quotes'):
newlbl = subinstr(`"`varlbl'"',`"`"',"",.)
newlbl = subinstr(`"`varlbl'"',`"`"',"",.) // escaping doesn't help, either
如果该字符存在,则执行其他操作(失败 w/ 'too few quotes'):
if strpos("
varlbl'"',"
"')>0 {
// 别的东西
}
用一个局部变量来表示反引号(在这种情况下失败且愚蠢):
local bt `"`"'
local newlbl = subinstr(`"`varlbl'"',`"`bt'"',"",.)
使用 -regexr- 因为它可能更健壮 (fails w/ 'too few quotes'):
local varlbl = regexr(`"`varlbl'"',"`","")
导出为纯文本或 XML 并使用另一种语言 find/replace,使用 xmlsave
或 outfile, dictionary
。 这可行,但是是一个痛苦的解决方法。
因为这些反引号纯粹是令人讨厌的东西,所以删除它们就足够了。感谢阅读、考虑和任何反馈。干杯!
这应该可以做到。我使用了两个生成语句来显示详细信息,char(96)
可以用作 subinstr()
.
的第二个参数
. clear
. input str30 lbl
lbl
1. "See/hear ACT: `Newspaper"
2. end
. generate from = char(96)
. generate lbl2 = subinstr(lbl,from,"",.)
. list, clean noobs
lbl from lbl2
See/hear ACT: `Newspaper ` See/hear ACT: Newspaper
.
好的,这是一种更符合问题的方法。我没有花任何精力去探索如何让它更优雅。关键是使用宏扩展函数subinstr
而不是使用非宏函数subinstr()
.
. describe x
storage display value
variable name type format label variable label
------------------------------------------------------------------------------------------------
x float %9.0g junk with `backtick
. local xl : variable label x
. local b `"`"'
. local xl2 : subinstr local xl "`b'" ""
. display "`xl2'"
junk with backtick
.
我正在处理大约一百个从 SPSS 文件导入的 Stata 数据文件,我无法再访问这些文件。在构建跨所有文件的摘要描述时,我记录了变量和值标签,其中包括如下循环:
foreach v of varlist _all {
local varlbl: variable label `v'
// do some more things
file write `outfile' `"`v'"' // and some other stuff
}
这几乎一直都很好,额外的反引号和单引号正确地转义了更常见的半问题内容,例如变量标签中的内联引号。
打破它的是这样的标签:
BC9C str1 %-1s BC9C See/hear ACT: `Newspaper
此处无法处理 Newspaper
之前的行内反引号。我尝试了以下方法来处理这个问题,除了#5 彼此之间存在细微差别:
删除违规字符(失败 w/ 'too few quotes'):
newlbl = subinstr(`"`varlbl'"',`"`"',"",.) newlbl = subinstr(`"`varlbl'"',`"`"',"",.) // escaping doesn't help, either
如果该字符存在,则执行其他操作(失败 w/ 'too few quotes'):
if strpos(
"
varlbl'"',"
"')>0 { // 别的东西 }用一个局部变量来表示反引号(在这种情况下失败且愚蠢):
local bt `"`"' local newlbl = subinstr(`"`varlbl'"',`"`bt'"',"",.)
使用 -regexr- 因为它可能更健壮 (fails w/ 'too few quotes'):
local varlbl = regexr(`"`varlbl'"',"`","")
导出为纯文本或 XML 并使用另一种语言 find/replace,使用
xmlsave
或outfile, dictionary
。 这可行,但是是一个痛苦的解决方法。
因为这些反引号纯粹是令人讨厌的东西,所以删除它们就足够了。感谢阅读、考虑和任何反馈。干杯!
这应该可以做到。我使用了两个生成语句来显示详细信息,char(96)
可以用作 subinstr()
.
. clear
. input str30 lbl
lbl
1. "See/hear ACT: `Newspaper"
2. end
. generate from = char(96)
. generate lbl2 = subinstr(lbl,from,"",.)
. list, clean noobs
lbl from lbl2
See/hear ACT: `Newspaper ` See/hear ACT: Newspaper
.
好的,这是一种更符合问题的方法。我没有花任何精力去探索如何让它更优雅。关键是使用宏扩展函数subinstr
而不是使用非宏函数subinstr()
.
. describe x
storage display value
variable name type format label variable label
------------------------------------------------------------------------------------------------
x float %9.0g junk with `backtick
. local xl : variable label x
. local b `"`"'
. local xl2 : subinstr local xl "`b'" ""
. display "`xl2'"
junk with backtick
.