我想打开一个文件“my_query.sql”,并将该文件的整个文本读入一些宏变量x
。
显然,我应该从以下内容开始:
file open myfile using my_query.sql
但我的问题是file read myfile x
不正确,因为它只是读取第一行......
我最初的想法:
答案 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个字符 - 它不知道在哪里停止。我想如果你知道什么意味着你的操作系统上的文本结束文件,你可以搜索该字符并将所有内容子串到它。但目前解决这个问题已经超出了我的范围。并且您想要用空格替换换行符。
如果可以为您效劳,我希望看到解决方案。