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

是否将整个文件读入Stata宏变量?,stata,Stata,我想打开一个文件“my_query.sql”,并将该文件的整个文本读入某个宏变量x 显然,我应该从以下内容开始: file open myfile using my_query.sql 但是我的问题是,文件读取myfile x不太正确,因为它只读取第一行 我最初的想法是: 也许有一种方法可以用二进制打开它,然后用一个命令读取整个内容 或者我必须做一些修改,逐行读取文件并将字符串连接在一起 我首选的解决方案是“黑客入侵、逐行读取文件并连接”解决方案 我也能理解为什么这个解决方案看起来像是被破解

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

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

file open myfile using my_query.sql
但是我的问题是,
文件读取myfile x
不太正确,因为它只读取第一行

我最初的想法是:

  • 也许有一种方法可以用二进制打开它,然后用一个命令读取整个内容
  • 或者我必须做一些修改,逐行读取文件并将字符串连接在一起

我首选的解决方案是“黑客入侵、逐行读取文件并连接”解决方案

我也能理解为什么这个解决方案看起来像是被破解了,特别是对于那些来自编程语言的人来说。例如,与Java中的BufferedReader类似的东西相比,这种方法可能看起来很愚蠢,但我离题了

执行
file read myfile x
时,只会得到文件的第一行,因为根据
帮助文件
中的文档:

文件位于顶部(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
循环。这是一个文件结束标记,当
文件读取
到达文件结尾时,其计算结果为1。

我首选的解决方案是“黑客入侵,逐行读取文件并连接”解决方案

我也能理解为什么这个解决方案看起来像是被破解了,特别是对于那些来自编程语言的人来说。例如,与Java中的BufferedReader类似的东西相比,这种方法可能看起来很愚蠢,但我离题了

执行
file read myfile x
时,只会得到文件的第一行,因为根据
帮助文件
中的文档:

文件位于顶部(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
循环。这是一个文件结束标记,当
文件读取
到达文件结尾时,它的计算结果为1。

以下内容可以帮助您以二进制方式打开文件并将其读入本地宏

好消息是,这似乎可以一次性将整个文本文件读入宏

clear *

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

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

file close myfile
di "`line'"
坏消息是,它(如所写)读100个字符——它不知道在哪里停下来。我认为,若你们知道在你们的操作系统上什么是文本文件的结尾,你们可以搜索那个字符,然后把所有的子串添加到它上面。但目前我无法处理这件事。您需要用空格替换换行符


如果这可以为您工作,我希望看到解决方案。

这里有一些东西可以帮助您以二进制格式打开文件并将其读入本地宏

好消息是,这似乎可以一次性将整个文本文件读入宏

clear *

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

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

file close myfile
di "`line'"
坏消息是,它(如所写)读100个字符——它不知道在哪里停下来。我认为,若你们知道在你们的操作系统上什么是文本文件的结尾,你们可以搜索那个字符,然后把所有的子串添加到它上面。但目前我无法处理这件事。您需要用空格替换换行符


如果这能为您服务,我希望看到解决方案。

可能相关。可能是相关的。它感觉不太安全,但在我的简短测试中,
文件读取myfile%100000s行
似乎确实有效。使用
display
命令显示宏变量已设置完毕,但通过odbc发送宏变量进行查询工作正常
odbc load,exec(
line')`。。。(到目前为止)。
显示
用于显示文本。在我的测试中,Stata读取的“二进制字符串”由包含构成SQL脚本的ASCII字符的初始字节组成,然后是文件系统中的一些字节的垃圾,填充了最后一个字节的末尾(仅在本例中)分配给该文件的文件系统的块。对我来说,
display
清晰地打印出初始文本;当它试图将垃圾解释为文本字符时,会出现垃圾。因此,我想弄清楚二进制文件的结尾是如何表示的;答案可能不是这样。因此,我很高兴(到目前为止)将字符串传递到ODBC成功了。虽然感觉不太安全,但在我的简短测试中,
file read myfile%100000s行
似乎确实有效。使用
display
命令显示宏变量已设置完毕,但通过odbc发送宏变量进行查询工作正常
odbc load,exec(
line')`。。。(到目前为止)。
显示
用于