如何在Stata中通过循环导入忽略随机后缀的CSV文件?
问题描述
我有数百个CSV数据文件,想要通过4层循环导入Stata:其中x是遍历不同市场的foreach循环,i、j、k是遍历年、月、日的forvalues循环。但每个文件名末尾都有以.T开头的无规律随机后缀,没法通过循环匹配,手动删除又太繁琐。
我尝试了以下代码但无法成功导入,也没有报错,求可行的解决方法(比如忽略后缀或批量移除):
初始尝试代码
import delimited "path\`x´name`i´`j´`k´.T0653248.csv clear"
目标循环代码
foreach x in CO CR EQ FX IR { // 遍历市场 forvalues i = 2022/2022 { // 遍历年份 forvalues j = 9/9 { // 遍历月份 forvalues k = 23/23 { // 遍历日期 import delimited "path\ETD_`x'_Trade_State_Report`i'0`j'`k'.csv", varnames(3) clear some data commands } } } }
已尝试的代码
clear all set more off, permanently local path "path" local files : dir "`path'" files "*.csv" foreach file of local files { foreach x in CO CR EQ FX IR { forvalues i = 22/22 { forvalues j = 10/10 { forvalues k = 31/31 { if strpos("`file'", "ETD_`x'_Trade_State_Report.D`i'`j'`k'") { import delimited "`path'/`file'", varnames(3) clear } } } } } }
可行解决方案
方案一:批量移除随机后缀(重命名文件)
直接批量修改文件名,去掉.T开头的随机部分,之后就能用你的目标循环代码直接导入。
方法1:用Stata代码批量重命名
clear all set more off local path "你的文件路径" local files : dir "`path'" files "ETD_*_Trade_State_Report*.csv" foreach file of local files { // 提取.T之前的字符串作为新文件名 local new_file = substr("`file'", 1, strpos("`file'", ".T") - 1) + ".csv" // 复制并重命名文件(保留原文件) copy "`path'/`file'" "`path'/`new_file'", replace // 若不需要原文件,可添加此行删除原文件: // erase "`path'/`file'" }
注意:需确保文件名中只有一处
.T,避免误截断。
方法2:用Windows系统命令快速处理
如果是Windows环境,打开文件所在目录的命令提示符(CMD),直接执行:
ren *.T*.csv *.csv
这个命令会自动把所有含.T的CSV文件名,截断到.T之前的部分,直接去掉随机后缀。
方案二:循环中忽略后缀,直接匹配核心文件名
不需要修改文件,直接在循环里匹配文件名的核心标识(市场、年、月、日):
clear all set more off, permanently local path "你的文件路径" local files : dir "`path'" files "ETD_*_Trade_State_Report*.csv" foreach x in CO CR EQ FX IR { forvalues i = 2022/2022 { forvalues j = 9/9 { forvalues k = 23/23 { // 构造要匹配的核心文件名 local core_name = "ETD_`x'_Trade_State_Report`i'0`j'`k'" // 在所有文件里找包含核心名的文件 foreach file of local files { if strpos("`file'", "`core_name'") { import delimited "`path'/`file'", varnames(3) clear // 这里写入你的数据处理命令 some data commands // 找到对应文件后跳出内层循环,避免重复处理 continue, break } } } } } }
这个思路是先获取所有CSV文件,再对每一组x/i/j/k,去文件列表里找包含核心文件名的文件,不管后缀是什么,只要核心部分匹配就导入。
你之前代码失败的原因
你已尝试的代码中,匹配字符串写的是ETD_x'_Trade_State_Report.Di'j'k',但目标文件名的核心部分是ETD_x'_Trade_State_Reporti'0j'k'(比如2022年9月23日对应20220923),这里的.D和数字格式不匹配,导致strpos找不到对应文件,所以没有执行导入也不会报错。
内容的提问来源于stack exchange,提问作者TerribleStudent
相关产品推荐
相关产品推荐

