纯ruby:按select筛选csv日期,但现在希望根据这些日期范围获得另一列

纯ruby:按select筛选csv日期,但现在希望根据这些日期范围获得另一列,ruby,csv,Ruby,Csv,因此,基本上我试图通过Rubynote在一个巨大的csv文件中查找一些信息。我不需要excel解决方案,我已经将unix时间戳转换为适当的时间对象,并通过select对它们进行排序和过滤。我试图找到关于购买金额的信息,给定这个特定的时间范围,我用开始日期、结束日期表示 目前,我只有一个通过巨大的csv过滤的时间数组,但如何使用我的代码获得csv中给出的购买金额 Unix_time purchase_amt 1352948920 12.40 require 'csv' require

因此,基本上我试图通过Rubynote在一个巨大的csv文件中查找一些信息。我不需要excel解决方案,我已经将unix时间戳转换为适当的时间对象,并通过select对它们进行排序和过滤。我试图找到关于购买金额的信息,给定这个特定的时间范围,我用开始日期、结束日期表示

目前,我只有一个通过巨大的csv过滤的时间数组,但如何使用我的代码获得csv中给出的购买金额

Unix_time    purchase_amt
1352948920   12.40

require 'csv'
require 'date'

start_date = DateTime.rfc3339('2014-06-22T00:00:00Z').to_time.to_i
end_date = DateTime.rfc3339('2014-07-22T00:00:00Z').to_time.to_i

csv = CSV.parse('sample_data.csv', headers: true, encoding: 'ISO-8859-1')

csv.each do |row|
    if (row['created_at'] >= start_date && row['created_at'] <= end_date)
        final_arry<< row
    end
end

puts csv

如果我没有错,您希望提取属于开始日期..结束日期范围的记录。 现在,更好的解决方案是将开始日期和结束日期转换为unix时间戳,如下所示:

require 'date'

DateTime.rfc3339('2015-05-27T07:39:59Z')
#=> #<DateTime: 2015-05-27T07:39:59+00:00 ((2457170j,27599s,0n),+0s,2299161j)>

DateTime.rfc3339('2015-05-27T07:39:59Z').to_time
#=> 2015-05-27 09:39:59 +0200

DateTime.rfc3339('2015-05-27T07:39:59Z').to_time.to_i
#=> 1432712399
如本文所述:

现在,您应该能够运行csv,如:

csv = CSV.parse('sample_data.csv', :headers => true, :encoding => 'ISO-8859-1')
csv.each do |row|
  # apply your conditions here
  # something like...
  if row['date'] >=start_date && row['date']<=end_date
  # append it to some array
  # ary << row
  end
end

让我知道这是否适用于您

如果我没有错,您希望提取属于开始日期..结束日期范围的记录。 现在,更好的解决方案是将开始日期和结束日期转换为unix时间戳,如下所示:

require 'date'

DateTime.rfc3339('2015-05-27T07:39:59Z')
#=> #<DateTime: 2015-05-27T07:39:59+00:00 ((2457170j,27599s,0n),+0s,2299161j)>

DateTime.rfc3339('2015-05-27T07:39:59Z').to_time
#=> 2015-05-27 09:39:59 +0200

DateTime.rfc3339('2015-05-27T07:39:59Z').to_time.to_i
#=> 1432712399
如本文所述:

现在,您应该能够运行csv,如:

csv = CSV.parse('sample_data.csv', :headers => true, :encoding => 'ISO-8859-1')
csv.each do |row|
  # apply your conditions here
  # something like...
  if row['date'] >=start_date && row['date']<=end_date
  # append it to some array
  # ary << row
  end
end

让我知道这是否适用于您

如果您有一个巨大的CSV,您应该使用。 它逐个解析行,而不将整个文件加载到内存中

也有助于:

如果obj在范围的开始和结束之间,则返回true

如果可以,还应该在块内执行所有计算,而不返回可能会变得巨大的新数组。不过,您似乎确实需要一个巨大的阵列,因此:

require 'csv'

amounts = []

start_date = Time.new(2012, 1, 22)
end_date   = Time.new(2014, 7, 22)

search_range = (start_date.to_i..end_date.to_i)

CSV.foreach('data.csv', headers: true, col_sep: "\s", skip_blanks: true) do |row|
  next unless search_range.cover?(row['Unix_time'].to_i)
  amounts << row['purchase_amt'].to_f
end

p amounts

如果你有一个巨大的CSV,你应该使用。 它逐个解析行,而不将整个文件加载到内存中

也有助于:

如果obj在范围的开始和结束之间,则返回true

如果可以,还应该在块内执行所有计算,而不返回可能会变得巨大的新数组。不过,您似乎确实需要一个巨大的阵列,因此:

require 'csv'

amounts = []

start_date = Time.new(2012, 1, 22)
end_date   = Time.new(2014, 7, 22)

search_range = (start_date.to_i..end_date.to_i)

CSV.foreach('data.csv', headers: true, col_sep: "\s", skip_blanks: true) do |row|
  next unless search_range.cover?(row['Unix_time'].to_i)
  amounts << row['purchase_amt'].to_f
end

p amounts


我想我应该通过csv[采购金额]直接访问采购金额,但是我想知道接下来我如何处理这个庞大的数组并应用我以前做过的过滤工作…一个解决方案是在第一次迭代时修改csv中的列值unix_time..这样每个列都有符合您要求的日期,然后在第二次迭代时,您可以检查它是否属于开始日期或结束日期..如果是,那么获取行['purchase\u amt'],您能澄清一下吗?请给我举个例子好吗?你应该打印final_数组而不是csv…在循环csv之前也要初始化final_数组,如下所示:final_数组=[]@Abhinay好的,我初始化了变量,也接受了你的建议,将行连接到final_数组,但我在终端中仍然没有得到输出:/我想我应该通过csv访问购买金额[“购买金额”]这是直截了当的,但我想知道我接下来如何处理这个庞大的数组并应用我以前做的过滤工作…一个解决方案是在第一次迭代时修改csv中的列值unix_time..以便每个列都有符合您要求的日期,然后在第二次迭代时,您可以检查它是否属于开始日期或者结束日期。如果是,则获取行['purchase\u amt']。您能澄清一下吗?请给我一个例子吗?您应该打印final\u array而不是csv…在循环csv之前也初始化final\u array,如下所示:final\u array=[]@A好的,我初始化了变量,也采纳了你的建议,将行连接到最终数组,但我仍然没有在终端中得到任何输出:,因此没有输出任何内容…我将更新上面的代码,向你说明发生了什么事记住,我想根据日期选择的条件最终获得购买金额,因此没有输出任何内容。。。我会更新上面的代码来告诉你发生了什么记得我想根据日期选择的条件最终得到购买金额这非常接近我想要的@EricDuminil,但我不是求和总金额,而是要一份在搜索范围内售出的每个价格的列表。这有意义吗?基本上是这样的在包含总金额的项次中,我希望我能在一个数组中提取每个单独的金额,这非常接近我想要的@EricDuminil,但不是求和总金额,我只想要一个在搜索范围内销售的每个价格的列表。这有意义吗?因此,基本上,我希望我能代替包含总金额的项次提取数组中的每个金额