2013-08-28 3 views
-2

다른 사이트의 일부 항목을 구문 분석하고 싶습니다.숫자를 구문 분석하여 레일에 루비

def self.run  
    ...  
    parsed_response = JSON.parse(response.body) 
    parsed_response.each do |item| 
    t = Page.new(:title => item["title"], :body => item["body"], :format_type => item["format_type"])  
    t.body.gsub!("Some text", "Other text") 
    t.save 
    end 
end 

문자열 본문에는 몇 가지 수식이 있습니다. 120 $; 130 $; 20 $ + 30 $ = 50 $ 등
각 숫자 10을 더하고 싶습니다. 어떻게 할 수 있습니까?
각 10에 합계를 추가하더라도 수식의 합계가 10보다 커야합니다. 그래서 합계 =를 빼고 합계를 계산해야합니다.

미리 감사드립니다.

P. 숫자가 많고 동적입니다. 시간 경과에 따른 변화의 예로 제시 한 수치입니다. 이 작동한다

+0

들은 동적 * 너의 *, 왜 다른 사이트라면 기본 데이터에 액세스하지 마십시오. 훨씬 쉽습니다. 분명히하기 : 개별 번호를 파싱하는 것은 비교적 쉽지만 합계를 감지하고 처리하는 것은 매우 복잡합니다. –

+0

예, 다른 사이트 광 – Andrew

+3

숫자가 분리되어 있으며 사이트에서 원시 데이터에 액세스하지 못하게하는 원인 어느 것이 합쳐 졌는가? 이것은 문자열을 처리하는 것보다 훨씬 쉽습니다. –

답변

1

def is_a_number?(s) 
    s.to_s.match(/\A[+-]?\d+?(\.\d+)?\Z/) == nil ? false : true 
end 

str = "120 $; 130 $; 20 $ + 30 $ = 50 $" 
str_parts = str.split(" ") 

equals_indices = str_parts.each_index.select{|i| str_parts[i] == "="} 

str_parts.each_with_index do |p,i| 
    if is_a_number?(p) 

    #non-sum numbers 
    if (str_parts[i-1] != "=") 
     str_parts[i]=(p.to_i+10).to_s 

    #sums 
    else 
     prior_equals_index = equals_indices.select{|ind| ind < i-1}.max || 0 
     n_pluses = str_parts[prior_equals_index,i].count("+") 
     str_parts[i]=(p.to_i+(n_pluses+1)*10).to_s 
    end 

    end 
end 

add_10_str = str_parts.join(" ") 

=> '130 개 $ 140 $] + $ 40 $ 30 = 70 $ "

+0

대답은 Thx지만이 문자열에는이 숫자가 포함되어 있기 때문에 나를 위해 작동하지 않습니다. 많은 텍스트가 많은 수와 많은 수식. Ø이 숫자는 매주 변경되는 텍스트 수식을 나타냅니다. – Andrew