0

我有一个在编辑器中看起来像这样的 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

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

有任何想法吗?

4

1 回答 1

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
于 2012-05-13T18:21:58.357 回答