我有一个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
我想搜索并替换文件中的一些字符串,但现在似乎不可能
任何想法?
答案 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