Stata 文件操作是不是太麻烦了?

Stata 文件操作是不是太麻烦了?

我常常非常恼火 Stata 中操作文件的 file 命令使用起来非常的麻烦,因为这个名称操作文件通常需要下面三句:

Stata
1
2
3
4
file open  handle using filename, {read|write|read write} [
[text|binary] [replace|append] all ]
file write handle [specs]
file close {handle|_all}

这在实际使用的时候就变得非常麻烦了,今天突然想到其实可以直接使用 shell 命令。

例如我想写一个 python 脚本:

Python
1
2
3
from tushare import *
df = get_hist_data('000001')
df.to_csv('000001.csv')

该脚本可以使用 tushare 包下载平安银行的股票数据。
使用 file 命令写一个这个文件需要这样做:

Stata
1
2
3
4
5
file open myfile using temp.py, write replace
file write myfile "from tushare import *" _n
file write myfile "df = get_hist_data('000001')" _n
file write myfile "df.to_csv('000001.csv')" _n
file close myfile

使用///换行的话可以简化上面的代码:

Python
1
2
3
4
5
6
file open myfile using temp.py, write replace
file write myfile ///
"from tushare import *" _n ///
"df = get_hist_data('000001')" _n ///
"df.to_csv('000001.csv')" _n
file close myfile

此外我还用这种方法写了一个 pycall 命令:

Stata
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
*! pycall: 在Stata中运行Python代码
*! 程振兴 2018年8月14日
*! 该命令的实现原理是将Python代码保存为一个临时的py文件,然后将该文件使用命令行的python3运行,然后将结果返回。一段示例的原始代码如下:
*! ########################### !*
*! ### 原理
*! ########################### !*
*! file open myfile using temp.py, write replace
*! file write myfile "from tushare import *" _n
*! file write myfile "df = get_hist_data('000001')" _n
*! file write myfile "df.to_csv('000001.csv')" _n
*! file close myfile
*! !/Users/mr.cheng/anaconda3/bin/python3 temp.py > temp.txt
*! ########################### !*
*! ### 示例
*! ########################### !*
*! pycall, s
*! pycall "from tushare import *"
*! pycall "df = get_hist_data('000001')"
*! pycall "df.to_csv('000001.csv')"
*! pycall "for i in range(1, 10):print(i)"
*! pycall, e r t
cap prog drop pycall
prog def pycall
version 14.0
syntax [anything(name = pycode)] [, Start End Run Txt]
if "`start'" != ""{
cap file close myfile
file open myfile using temppyfile.py, write replace
}
if "`txt'" != ""{
local out = "> output.txt"
}
if "`end'" != ""{
file close myfile
}
else{
file write myfile `pycode' _n
}
if "`run'" != ""{
!/Users/mr.cheng/anaconda3/bin/python3 temppyfile.py `out'
erase temppyfile.py
}
end

实际上如果使用 shell 命令完成上面的操作就很简单了,这个主要使用两个 shell 命令:echotouch,touch 可以用于用于创建一个空文件(不用也行,但是如果是要写一个新文件,一定要删除源文件。),然后 echo 可以用于向文件中插入字符。

Shell
1
2
3
4
5
6
7
8
* 先删除temp.py
!rm temp.py
* 创建一个空文件
!touch temp.py
* 然后插入字符
!echo -e "from tushare import *\ndf = get_hist_data('000001')\ndf.to_csv('000001.csv')" >> temp.py
* 运行脚本
!/Users/mr.cheng/anaconda3/bin/python3 temp.py

由于///换行符在 Stata 中会被翻译成一个空格,所以这里最好不要使用,否则 python 程序运行会出错。
或者一行一行的插入也行:

Shell
1
2
3
4
5
6
7
8
* 先删除temp.py
!rm temp.py
* 创建一个空文件
!touch temp.py
* 然后插入字符
!echo "from tushare import *" >> temp.py
!echo "df = get_hist_data('000001')" >> temp.py
!echo "df.to_csv('000001.csv')" >> temp.py

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×