循环遍历文件夹以生成并保存每个文件的图形

Looping through folder to generate and save graph for each file

下面是我从 dataex 创建的 csv 文件之一,用于重现示例:

clear

input str32 eventname str10 scrapedate float(average thpercentile v5 v6)
"EventName" "2015-12-15"  136.9255     83.2 104.875    148.75
"EventName" "2015-12-16"  130.4555    78.55      99    138.22
"EventName" "2015-12-17" 123.66705     72.7   90.25     131.2
"EventName" "2015-12-18" 116.45757   64.855   78.55     119.5
"EventName" "2015-12-19" 108.63446 60.56333    72.7 119.07333
"EventName" "2015-12-20"  94.97125    55.15   69.77    112.48
end

感谢对我的 的回答,我能够调整我的代码以循环遍历目录 "I:\Games CSVs\" 并使用以下命令读取每个 csv 文件:

insheet using "`file'", comma clear

然后创建一个新变量,将数据格式更改为我想要的格式并生成折线图。

这是我的代码:

local foodir "I:\Games CSVs\" 
local files : dir "`foodir'" files "*.csv"
cd "`foodir'"
local i = 0
foreach file of local files {
    local ++i
    insheet using "`file'", comma clear
    generate ScrapeDate = daily(scrapedate, "YMD")
    format ScrapeDate %tdYY-NN-DD 
    line average thpercentile v5 v6 ScrapeDate, name("graph`i'", replace) ///
    scale(*.7) ///
    local filename = substr("`file'", 1, strlen("`file'")-4) ///
    title(filename) ///
    ytitle("Price in US$") ///
    legend(size(small)) 
}

有问题的行如下:

local filename = substr("`file'", 1, strlen("`file'")-4)` 
title(filename)

我也试过:

generate filename = substr("`file'", 1, strlen("`file'")-4)` 
title(filename)

我有以下问题:

  1. 文件的标题为 filename.csv,我希望删除后缀。
  2. 我也不知道如何将图表保存在磁盘上。

所有的图(我有52张)都在一个接一个的闪烁。这对我来说是理想的,如果我可以将它们全部保存在一个文件夹中(I:\Graphs),其中 filenamefilename.csv 相同,而不是在这里保存为 filename.pngfilename.jpeg 或任何我可以打开的格式。

我已阅读文档。我相信 graph save mygraph 会替换图表(如果它存在),并且由于我在目录中循环,所以每次都会替换图表,因为我没有更改图表的名称。

您需要正确定义局部宏filename后才能使用。您还需要在 line 命令中使用 saving()nodraw 选项:

local foodir "I:\Games CSVs\"
local foosavedir "I:\Graphs\"

local files : dir "`foodir'" files "*.csv"
cd "`foodir'"

local i = 0
foreach file of local files {
    local ++i
    insheet using "`file'", comma clear
    generate ScrapeDate = daily(scrapedate, "YMD")
    format ScrapeDate %tdYY-NN-DD 
    local filename = substr("`file'", 1, strrpos("`file'", ".")-1)
    line average thpercentile v5 v6 ScrapeDate, name("graph`i'", replace) ///
    saving("`foosavedir'`filename'.gph", replace) nodraw scale(*.7) title("`filename'") /// 
    ytitle("Price in US$") legend(size(small)) 
}

请注意,通过这种方式,文件将以 Stata 的 gph 本机格式保存,这始终是最好的做法,以便您可以在以后根据需要进行编辑。

如果您还希望它们采用不同的图形格式,例如 png,那么您需要在 line 命令后导出它们中的每一个:

graph export "`foosavedir'`filename'.png", name("graph`i'")

在这种情况下,您必须没有line中指定nodraw选项。

如果指定选项 replace,并且 saved/exported 文件的名称与现有文件冲突,则图表将被替换。如果文件名是唯一的,你就不应该有这个问题。