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

时间:2016-05-25 21:11:47

标签: stata

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

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

file open myfile using my_query.sql

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

我最初的想法:

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

2 个答案:

答案 0 :(得分: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

然后解决方案成为:

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'"

结果:

SELECT * FROM MyTable WHERE Condition 

在这里,我使用r(eof)来调整我的while循环。这是文件结束标记,当file read到达文件末尾时评估为1。

答案 1 :(得分:3)

这可以帮助您以二进制文件打开文件并将其读入本地宏。

好消息是,这似乎是在一次阅读中将整个文本文件读入宏。

clear *

file open myfile using "SqlScript.sql", read binary

file read myfile %100s line
local x "`line'"

file close myfile
di "`line'"

坏消息,它(正如所写)读取100个字符 - 它不知道在哪里停止。我想如果你知道什么意味着你的操作系统上的文本结束文件,你可以搜索该字符并将所有内容子串到它。但目前解决这个问题已经超出了我的范围。并且您想要用空格替换换行符。

如果可以为您效劳,我希望看到解决方案。