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 彼此之间存在细微差别:

  1. 删除违规字符(失败 w/ 'too few quotes'):

    newlbl = subinstr(`"`varlbl'"',`"`"',"",.)
    newlbl = subinstr(`"`varlbl'"',`"`"',"",.) // escaping doesn't help, either
  2. 如果该字符存在,则执行其他操作(失败 w/ 'too few quotes'):

    if strpos("varlbl'"',""')>0 { // 别的东西 }

  3. 用一个局部变量来表示反引号(在这种情况下失败且愚蠢):

    local bt `"`"'
    local newlbl = subinstr(`"`varlbl'"',`"`bt'"',"",.)
  4. 使用 -regexr- 因为它可能更健壮 (fails w/ 'too few quotes'):

    local varlbl = regexr(`"`varlbl'"',"`","")
  5. 导出为纯文本或 XML 并使用另一种语言 find/replace,使用 xmlsaveoutfile, 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

.