将整个文件读入Stata宏变量?

Mat*_*unn 1 stata

我想打开一个文件"my_query.sql"并将该文件的整个文本读入一些宏变量x.

显然,我应该从以下内容开始:

file open myfile using my_query.sql
Run Code Online (Sandbox Code Playgroud)

但我的问题是,这file read myfile x不太正确,因为它只是读取第一行...

我最初的想法:

  • 也许有一种方法可以用二进制打开它并用一个命令读取整个内容?
  • 或者我是否需要进行一些黑客攻击,逐行读取文件并将字符串连接在一起?

小智 5

我首选的解决方案是"黑客攻击,逐行读取文件并连接"解决方案.

我也可以理解为什么解决方案可能会被破解,特别是对于来自编程语言的人来说.例如,这种方法甚至可能看起来像Java中的BufferedReader,但我离题了...

执行时只能获取文件的第一行,file read myfile x因为根据以下文档help file:

"文件位于顶部(tof),因此第一个文件读取在文件的开头读取."

如果您正在写入文件,这实际上是一种方便,file write因为您不必在要写入的字符串中嵌入换行符 - 每次调用file write都会写一个新行.

现在,有一个非常简单的循环结构,允许我们逐行读取并将内容存储到宏中.

所以,如果我在/ path/to/my/file /标题为SqlScript.sql的.sql文件中包含以下内容:

SELECT *
FROM MyTable
WHERE Condition
Run Code Online (Sandbox Code Playgroud)

然后解决方案成为:

clear *

file open myfile using "/path/to/my/file/SqlScript.sql", read

file read myfile line
local x "`line'"

while r(eof) == 0 {
    file read myfile line
    local x "`x'" " " "`line'"
}
file close myfile
di "`x'"
Run Code Online (Sandbox Code Playgroud)

结果:

SELECT * FROM MyTable WHERE Condition 
Run Code Online (Sandbox Code Playgroud)

在这里,我习惯于r(eof)调整我的while循环.这是文件结束标记,在file read到达文件末尾时计算结果为1 .