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
}

先頭の BOM が見えます\uFEFFif exists (sele...か? それを取り除くには、次を使用します。

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 に答える