我在寫一個過濾器程序,它讀取包含地址數據的CSV文件,並排除位於新月(cres),大道(ave)或地點(pl)中的行。Chaning Ruby正則表達式運算符
下面是一些例子輸入:
data = <<CSV
ID,Street address,Town,Valuation date,Value
1,1 Northburn RD,WANAKA,1/1/2015,280000
2,1 Mount Ida PL,WANAKA,1/1/2015,280000
3,1 Mount Linton AVE,WANAKA,1/1/2015,780000
4,1 Centre CRES,WANAKA,1/1/2015,295000
CSV
require 'csv'
elements = []
CSV.parse(data, headers: true, header_converters: :symbol) do |row|
elements << row.to_h
end
elements
#=> [
# {:id=>"1", :street_address=>"1 Northburn RD", :town=>"WANAKA", :valuation_date=>"1/1/2015", :value=>"280000"},
# {:id=>"2", :street_address=>"1 Mount Ida PL", :town=>"WANAKA", :valuation_date=>"1/1/2015", :value=>"280000"},
# {:id=>"3", :street_address=>"1 Mount Linton AVE", :town=>"WANAKA", :valuation_date=>"1/1/2015", :value=>"780000"},
# {:id=>"4", :street_address=>"1 Centre CRES", :town=>"WANAKA", :valuation_date=>"1/1/2015", :value=>"295000"}
# ]
我可以用簡單的正則表達式來過濾三個中的一個,即/pl/
,/cres/
和/ave/
,但他們使用&&
我不能鏈條:(也不它們的功能,當我把它們分成三個獨立的「過濾器」)
elements.select { |e| e[:street_address].downcase! !~ /pl/ && e[:street_address].downcase! !~ /cres/ && e[:street_address].downcase! !~ /ave/ }
#=> [
# {:id=>"1", :street_address=>"1 northburn rd", :town=>"WANAKA", :valuation_date=>"1/1/2015", :value=>"280000"},
# {:id=>"3", :street_address=>"1 mount linton ave", :town=>"WANAKA", :valuation_date=>"1/1/2015", :value=>"780000"},
# {:id=>"4", :street_address=>"1 centre cres", :town=>"WANAKA", :valuation_date=>"1/1/2015", :value=>"295000"}
# ]
這種過濾掉條目#2如預期,但沒有#3,#4。
任何想法我失蹤?
是讀取CSV文件有關您的問題的代碼? (你應該使用Ruby的[CSV](http://ruby-doc.org/stdlib-2.3.1/libdoc/csv/rdoc/CSV.html)庫) – Stefan
不,它不是,工作得很好。只是過濾器部分是狡猾的,但我想我會包括一切,以防萬一:) 我也看看CSV庫! –
發佈其他人可以複製粘貼的代碼通常會更好。你能否爲'elements'和期望的輸出添加一些示例數據? – Stefan