Stata:处理包含受保护字符的变量标签

Stata:处理包含受保护字符的变量标签,stata,Stata,我正在处理从SPSS文件导入的大约100个Stata数据文件,我不再能够访问这些文件。在构建所有文件的摘要描述时,我记录了变量和值标签,其中包括如下循环: foreach v of varlist _all { local varlbl: variable label `v' // do some more things file write `outfile' `"`v'"' // and some other stuff } 这几乎一直都很好,额外的反勾号和单引号正确地避

我正在处理从SPSS文件导入的大约100个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
在这里,它不能处理
报纸
之前的内联倒勾。为了解决这个问题,我尝试了以下方法,除了#5之间的细微差别外:

  • 删除有问题的字符(失败w/“引号太少”):

  • 使用-regexr-因为它可能更健壮(失败w/“引号太少”):

    local varlbl=regexr(`varlbl',`varlbl',`
  • 导出为纯文本或XML,使用
    xmlsave
    outfile,dictionary
    使用另一种语言查找/替换。这是可行的,但却是一个痛苦的解决办法


  • 因为这些回跳是纯粹的滋扰,移除它们就足够了。感谢您的阅读、思考和任何反馈。干杯

    这应该可以。我使用了两个generate语句来显示细节,
    char(96)
    可以用作
    subinstr()
    的第二个参数


    好的,这里有一个更符合问题的方法。我一直在不遗余力地探索让它更优雅的方法。关键是使用宏扩展函数
    subinstr
    ,而不是使用非宏函数
    subinstr()


    很好,但是
    generate lbl2=subinstr(lbl,char(96),“”,,)
    避免在没有持久兴趣或使用的情况下将相同的常量字符放入新变量中。Nick,你是否错过了我在引用代码之前的介绍中使用两个generate语句的解释?我的目的是清楚地证明
    char(96)
    生成一个包含单个backquote.Fine的字符串。刚接触该设备的用户应该希望首先完成这项工作。这些建议回答了非常有用的问题(A)如何在Stata中处理字符代码,以及(b)反勾号的Stata字符代码是什么?不幸的是,在已经给出标签的地方,它不起作用。鉴于标签*抗生素来源:
    私人移动/外展诊所*,`gen from=char(96)`-local varlbl=subinstr(
    varlbl'”),from,”,``=local varlbl=subinstr(
    “抗生素来源:,from,”,)`背景标记仍然被解析。我用-regexm-尝试了相同的方法,得到了相同的结果。我花了超过分配给我的5分钟的时间试图得到正确的小降价,因此我被排除在前面的评论之外。鉴于标签*抗生素来源:
    私人移动/外展诊所*,并使用'gen from=char(96)`,`-local varlbl=subinstr(
    varlbl'”,from,“,”)`作为`=local varlbl=subinstr(
    “抗生素的来源:,from,”,)`执行,反勾号仍然被解析。我尝试过-regexm-,结果也是一样的。事实上,它做得非常出色。非常感谢。你们知道内联保护字符的容差是否是宏扩展函数的一个通用属性吗?我不能给出书面的确认,但这是我的信念。允许用户避免扩展宏的语法的存在向我表明,扩展字符串函数直接访问存储的宏字符串,允许它忽略特殊字符的含义。在使用宏扩展字符串函数时,
    \0
    是不允许使用的字符这一常见警告也表明使用了对字符串的直接访问。我注意到,回顾您过去的帖子,您可能不知道当您的问题工作到您满意的程度时,您可能会接受答案。但无论如何,我很高兴能帮上忙,即使我花了两次努力才把它做好!这是一个安全的推论,但在本例中,我在勾选“复选”标记之前失去了连接。现在,在实地,我很高兴接受你的回答。 newlbl = subinstr(`"`varlbl'"',`"`"',"",.) newlbl = subinstr(`"`varlbl'"',`"`"',"",.) // escaping doesn't help, either local bt `"`"' local newlbl = subinstr(`"`varlbl'"',`"`bt'"',"",.) local varlbl = regexr(`"`varlbl'"',"`","")
    . 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  
    
    .
    
    . 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
    
    .