我在写一个过滤器程序,它读取包含地址数据的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