如何用ruby修改.sql文件?

时间:2012-05-13 17:24:13

标签: sql ruby

我有一个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

我想搜索并替换文件中的一些字符串,但现在似乎不可能

任何想法?

1 个答案:

答案 0 :(得分:2)

使用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