如何用ruby修改.sql文件?
我有一个sql文件(alice.sql),在编辑器中看起来像这样
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_dg_object_extern_pub_dg_extern_pub_status]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)ALTER TABLE [dbo].[dg_object_extern_pub] DROP CONSTRAINT FK_dg_object_extern_pub_dg_extern_pub_status GO
如果我将该文件加载到irb中,它看起来像这样
f = File.open("alice.sql").readlines
它看起来像这样:(
=> ["\377\376i\000f\000 \000e\000x\000i\000s\000t\000s\000 \000(\000s\000e\000l\000e\000c\000t\000 \00
我想搜索并替换文件中的一些字符串,但现在这似乎不可能
有任何想法吗?
使用f = File.open("alice.sql").readlines
打开文件句柄,但从不关闭它。
你应该做:
f = File.open("alice.sql") lines = f.readlines f.close
要么
File.open("alice.sql"){|f| lines = f.readlines }
使用File#readlines
您将获得一系列行。 如果你想在字符串中进行替换,你应该使用read
来代替:
File.open("alice.sql"){|f| content = f.read }
最后,但并非最不重要:你的alice.sql似乎是UTF16,所以你必须把它读作UTF-16:
File.open("alice.sql", :encoding => 'UTF-16BE:UTF-8'){|f| content = f.read }
现在你得到\uFEFFif exists (sele...
你看到领先的BOM?要摆脱它,使用:
File.open("alice.sql", :encoding => 'BOM|UTF-16BE:UTF-8'){|f| content = f.read }
(需要ruby 1.9,也许BOM版本需要1.9.3)。
如果需要块外的内容,则必须在块外定义变量(或者使用File#close)
content = nil #define variable, so you get the content after the open-block File.open("alice.sql", :encoding => 'BOM|UTF-16BE:UTF-8'){|f| content = f.read } p content