如何用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