【发布时间】:2017-05-29 13:27:50
【问题描述】:
我有一个 CSV 文件,我需要读取并提取在一定范围内具有“created_at”的所有行。 CSV 本身在 Excel 中大约有 5000 行。
这就是我从文件中提取信息的方式:
CSV.foreach("sample_data.csv", :headers => true, :header_converters => :symbol, :converters => :all) do |row|
data[row.fields[0]] = Hash[row.headers[1..-1].zip(row.fields[1..-1])]
end
这是使用CSV.foreach后创建的最后一个Hash:
2760=>{:created_at=>1483189568, :readable_date=>"12/31/2016", :first_name=>"Louise", :last_name=>"Garza", :email=>"lgarza24n@drupal.org", :gender=>"Female", :company=>"Cogilith", :currency=>"EUR", :word=>"orchestration", :drug_brand=>"EPIVIR", :drug_name=>"lamivudine", :drug_company=>"State of Florida DOH Central Pharmacy", :pill_color=>"Maroon", :frequency=>"Yearly", :token=>"_", :keywords=>"in faucibus", :bitcoin_address=>"19jTjXLPQUL1nEmHrpqeqM1FdtDFZmUZ2E"}}
当我运行data[2759].first 时,我得到:
created_at
1309380645
我需要提取created_at 在range = 1403321503..1406082945 之间的每个哈希值。我在data 哈希上使用each 和collect 尝试了大约20 种不同的方法,但没有成功。我的最后一次尝试为每个原始哈希打印了一个空的{}。
我正在尝试对此进行测试,但没有成功:
data.each do |hash|
if hash.first.to_s.to_i > 1403321503 && hash.first.to_s.to_i < 1406082945
puts hash
end
end
我不确定如何隔离key:created_at 的值,然后查看它是否在范围内。我也尝试过hash.first.to_s.to_i =/== range。
我可以通过使用 data[1].first.last 获得 :created_at 值,但是当我尝试在方法中使用它时会出错。
这是原始 CSV 的链接:goo.gl/NOjAPo
它不在我的工作计算机上,所以我无法对其进行粘贴。
【问题讨论】:
-
从您的描述中无法判断发生了什么。您需要提供几行数据、产生错误答案的可运行代码以及相应的正确答案。例如。
data是散列还是数组还不清楚。你为什么不直接用符号索引散列,hash[:created_at]? -
提示:
(x..y).include?(z)是一种更简洁的检查某物是否在给定范围内的方法。你这里的内容要冗长得多,并且需要一堆冗余的方法调用。 -
在使用 Ruby 时要记住的另一件事是尝试将您的问题分解为一系列链式但简单的操作。例如,
reject你不想要的行,或select你想要的行,然后puts他们。