2016-06-20 7 views
1

私は面倒な状況に陥っています。私は現在失われている静的サイトジェネレータ(webby)で作成された多数のデータを移行する過程にあり、準ERBテンプレートファイルに大量のデータが格納されています。既存のテキストファイルからハッシュの配列を抽出するにはどうすればよいですか?

これらのファイルを解析して必要なものを取得し、それらを新しいアプリケーションデータファイルに書き込むRubyを作成しようとしています。

私が遭遇する問題は、既存のファイルに多くの正規化がなく、一部のパターンとのマッチングが難しいことです。

例えば、それぞれのイベント(これは技術会議ウェブサイト用)は、ハッシュの配列で構成されたその特定のイベントのスポンサーに関する情報を含む_sponsors.txtファイルを持っています。これらの配列は必ずしも全く同じ名前ではありませんが、一般的には類似しています。

これは、ファイルの一つの抜粋です:

<% @psponsors = [ 
{ :image => 'ca_technologies.png', :name => 'CA Technologies', :link =>  'http://www.ca.com/fr', :width => '100px', :height => '100px' }, 
{ :image => 'puppetlabs.png', :name => 'PuppetLabs', :link => 'https://puppetlabs.com', :width => '100px', :height => '100px' }, 
{ :image => 'microsoft_azure.png', :name => 'Microsoft Azure', :link => 'http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200618989', :width => '100px', :height => '100px' }, 
] %> 
<% if @psponsors.empty? %> 
<i>&nbsp;&nbsp;&nbsp;<a href='<%= File.join('/',@eventhome,'/sponsor') -%>'>Be the first to sponsor!</a></i> 
<% end %> 
<% @psponsors.each do |sponsor| %> 
<a href="<%= sponsor[:link] %>"><img border="1" alt="<%= sponsor[:name] %>" title="<%= sponsor[:name] %>" width="<%= sponsor[:width] %>" height="<%= sponsor[:height] %>" src="<%= File.join('/',@eventhome,"logos/#{sponsor[:image]}") %>" /></a> 
<% end %> 
<h1>Gold sponsors</h1> 
<% @gsponsors = [ 
{ :image => 'normation.png', :name => 'Normation', :link => 'http://www.normation.com', :width => '100px', :height => '100px' }, 
{ :image => 'gandi.png', :name => 'Gandi.net', :link => 'https://www.gandi.net', :width => '100px', :height => '100px' }, 
{ :image => 'xebialabs.png', :name => 'XebiaLabs', :link => 'http://www.xebialabs.com', :width => '100px', :height => '100px' }, 
{ :image => 'redhat.png', :name => 'Red Hat', :link => 'https://www.redhat.com', :width => '100px', :height => '100px' }, 
{ :image => 'delphix.png', :name => 'Delphix', :link => 'http://delphix.com', :width => '100px', :height => '100px' }, 
{ :image => 'chef.png', :name => 'Chef', :link => 'http://chef.io', :width => '100px', :height => '100px' }, 
] %> 

私は私が探している外部のパラメータ間のファイル全体と一致して読みしようとすると、私はマッチの束を取得し終わります私はほしくない。私の現在の回避策は、単に各行を読み込んで、その行が正しい開始点と一致する場合に状態を設定し、読み込みを続け、最後にヒットするとブレークします。これはまったく愉快ではないようですが、私はこれを行うもっとエレガントな方法が欠けていると確信しています。

+0

だからあなたは '@のpsponsors'と' @gspoを引っ張って欲しいものですnsors'をこのファイルから削除しますか? – thesecretmaster

+0

修正。問題は、ファイルの中には '@ psonsors'でなく、' @sponsors'や '@sponsors'かもしれないということです。しかし、一般的に言えば、私がこのサンプルでいくらか一般的に行う方法を理解できれば、それを異常値とどのように動作させるかを理解することができます。 –

答えて

2

これらのファイルを解析するのではなく、代わりにそれらを実行してみてください。これらの(またはすべて:instance_variables.each { |varname| ...)インスタンス変数をJSONとしてstdoutなどにダンプするコードを追加し、ERBインタープリタを介して実行してみてください。

+0

Hmm。それは考えだ。私が見ている問題は、a)約40-50のものがあります。それらのフォーマットは少し異なり、乱雑ですので、コードを追加するのが面倒かもしれませんが、b)実際にはもっと大きな移行プロセスの一部です私は、ファイルシステム上の各イベントのためにもっと多くのファイル/データを解析するものを書いています。これを1つのタイプのアクティビティにすることを望んでいました。私たちはこれまでに一度それをしようとしましたが、多くのものが失われました:( –

0

どうすればnokogirixpathが好きですか?

erb_template.erb

<% @psponsors = [ 
    {:image => 'ca_technologies.png', :name => 'CA Technologies', :link => 'http://www.ca.com/fr', :width => '100px', :height => '100px'}, 
    {:image => 'puppetlabs.png', :name => 'PuppetLabs', :link => 'https://puppetlabs.com', :width => '100px', :height => '100px'}, 
    {:image => 'microsoft_azure.png', :name => 'Microsoft Azure', :link => 'http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200618989', :width => '100px', :height => '100px'}, 
] %> 
<% if @psponsors.empty? %> 
    <i>&nbsp;&nbsp;&nbsp;<a href='http://localhost'>Be the first to sponsor!</a></i> 
<% end %> 
<% @psponsors.each do |sponsor| %> 
    <a href="<%= sponsor[:link] %>"><img border="1" alt="<%= sponsor[:name] %>" title="<%= sponsor[:name] %>" width="<%= sponsor[:width] %>" height="<%= sponsor[:height] %>" src="<%= File.join('/', @eventhome, "logos/#{sponsor[:image]}") %>"/></a> 
<% end %> 
<h1>Gold sponsors</h1> 
<% @gsponsors = [ 
    {:image => 'normation.png', :name => 'Normation', :link => 'http://www.normation.com', :width => '100px', :height => '100px'}, 
    {:image => 'gandi.png', :name => 'Gandi.net', :link => 'https://www.gandi.net', :width => '100px', :height => '100px'}, 
    {:image => 'xebialabs.png', :name => 'XebiaLabs', :link => 'http://www.xebialabs.com', :width => '100px', :height => '100px'}, 
    {:image => 'redhat.png', :name => 'Red Hat', :link => 'https://www.redhat.com', :width => '100px', :height => '100px'}, 
    {:image => 'delphix.png', :name => 'Delphix', :link => 'http://delphix.com', :width => '100px', :height => '100px'}, 
    {:image => 'chef.png', :name => 'Chef', :link => 'http://chef.io', :width => '100px', :height => '100px'}, 
] %> 
<% @gsponsors.each do |sponsor| %> 
    <a href="<%= sponsor[:link] %>"><img border="1" alt="<%= sponsor[:name] %>" title="<%= sponsor[:name] %>" width="<%= sponsor[:width] %>" height="<%= sponsor[:height] %>" src="<%= File.join('/', @eventhome, "logos/#{sponsor[:image]}") %>"/></a> 
<% end %> 

プロセス

# encoding: utf-8 

require 'nokogiri' 
require 'erb' 

@eventhome = "" 

path = File.join("./erb_template.erb") 
doc = Nokogiri::HTML(ERB.new(File.read(path)).result(binding)) 

links = doc.xpath("//a[./img]") 

export = links.each_with_object({}) do |element, h| 
    h[element["href"]] = element.first_element_child["title"] 
end 

出力

# { 
# "http://www.ca.com/fr" => "CA Technologies", 
# "https://puppetlabs.com" => "PuppetLabs", 
# "http://www.microsoft.com/click/services/Redirect2.ashx?CR_CC=200618989" => "Microsoft Azure", 
# "http://www.normation.com" => "Normation", 
# "https://www.gandi.net" => "Gandi.net", 
# "http://www.xebialabs.com" => "XebiaLabs", 
# "https://www.redhat.com" => "Red Hat", 
# "http://delphix.com" => "Delphix", 
# "http://chef.io" => "Chef" 
# } 
+0

ええと、私は彼らがpsponsorsやgsponsorsなどであるかどうか分かりませんでしたか? –

関連する問題