美文网首页stata连享会
Stata程序: 切割文件路径和文件名

Stata程序: 切割文件路径和文件名

作者: stata连享会 | 来源:发表于2018-11-19 17:22 被阅读134次

    作者:连玉君 (知乎 | 简书 | 码云)

    Stata连享会 精彩推文1 || 精彩推文2



    问题描述

    在编写 ado 文件时,要从用户输入的绝对文件路径中切割出「文件路径」和「文件名」。例如,

    • 用户输入的文件地址:「D:\stata15\ado\personal\mydata/bigfile.txt」
      切割后的希望得到:
    • 文件路径: 「D:\stata15\ado\personal\mydata/」
    • 文件名: 「bigfile.txt」

    解决思路

    以最后一个出现的 \/ 为分界点切开字符串,左侧的为文件路径,右侧的为文件名。

    有两种情形需要考虑:有些用户输入的文件地址信息中只有文件名,即默认存储于当前工作路径下的文档;还有些用户输入的文件地址同时包含 \/ 字符 (如本例)。

    因此,我们需要事先判断用户输入的文件地址中是否包含 \/ 字符;进而从字符串右侧确定 \/ 出现的位置,并以此为基础切割字符串。

    对于 Stata 14 以上的用户,可以使用 ustrrpos() 函数来确定某个字符最后一次出现的位置,详情参见 help ustrrpos()

    对于 Stata13 以前的用户,虽然没有 ustrrpos() 函数,但我们可以先使用 strreverse(s) 函数把用户输入的文件地址字符串翻转,继而使用 strpos() 函数确定 \/ 出现的位置即可。

    一旦确定了 \/ 最后一次出现的位置,就可以使用 substr() 函数进行切割了。

    范例:Stata 14 以上用户

    1  |  local filesource "D:\stata15\mydata/bigfile.txt"
    2  |  
    3  |  if strpos(`"`filesource'"', "\") | strpos(`"`filesource'"', "/"){
    4  |      local p1 = ustrrpos("`filesource'","\")   // stata14 +
    5  |      local p2 = ustrrpos("`filesource'","/")   // stata14 +
    6  |      local i = max(`p1', `p2')
    7  |  }
    8  |  else{
    9  |      local i = 0
    10 |  }
    11 |  
    12 |  local filepath = substr(`"`filesource'"',1,`i')
    13 |  local filename = substr(`"`filesource'"',`=`i'+1',.)
    

    输出结果如下:

    . dis `p1'
    11
    
    . dis `p2'
    18
    
    . dis `i'
    18
    
    . dis `"`filepath'"'
    D:\stata15\mydata/
    
    . dis `"`filename'"'
    bigfile.txt
    

    范例:Stata 13 以下用户

    表面上,似乎只需修改上述代码中的第 4-5 行即可,但实际上你还要修改一下第 12-13 行。这需要一点小学三年级的数学知识,留给读者自行思考了吧 ^_^。

    1  |  local filesource "D:\stata15\mydata/bigfile.txt"
    2  |  
    3  |  if strpos(`"`filesource'"', "\") | strpos(`"`filesource'"', "/"){
    4  |      local p1 = strpos(strreverse("`filesource'"),"\")   // stata14 +
    5  |      local p2 = strpos(strreverse("`filesource'"),"/")   // stata14 +
    6  |      local i = max(`p1', `p2')
    7  |  }
    8  |  else{
    9  |      local i = 0
    10 |  }
    11 |  
    12 |  local filepath = substr(`"`filesource'"',1,`=`i'-2')
    13 |  local filename = substr(`"`filesource'"',`i',.)
    

    关于我们

    • Stata 连享会(公众号:StataChina)】由中山大学连玉君老师团队创办,旨在定期与大家分享 Stata 应用的各种经验和技巧。
    • 公众号推文同步发布于 CSDN-Stata连享会简书-Stata连享会知乎-连玉君Stata专栏。可以在上述网站中搜索关键词StataStata连享会后关注我们。
    • 点击推文底部【阅读原文】可以查看推文中的链接并下载相关资料。
    • Stata连享会 精彩推文1 || 精彩推文2

    联系我们

    • 欢迎赐稿: 欢迎将您的文章或笔记投稿至Stata连享会(公众号: StataChina),我们会保留您的署名;录用稿件达五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
    • 意见和资料: 欢迎您的宝贵意见,您也可以来信索取推文中提及的程序和数据。
    • 招募英才: 欢迎加入我们的团队,一起学习 Stata。合作编辑或撰写稿件五篇以上,即可免费获得 Stata 现场培训 (初级或高级选其一) 资格。
    • 联系邮件: StataChina@163.com

    往期精彩推文


    欢迎加入Stata连享会(公众号: StataChina)

    相关文章

      网友评论

        本文标题:Stata程序: 切割文件路径和文件名

        本文链接:https://www.haomeiwen.com/subject/afsafqtx.html