2017-10-19 17 views
0

我正在一个CSV阅读器,并希望对数据进行操作,我想总结一列 - 年,但确保不超过一定数量的点 - 比如说100万。我无法对列进行总结,它正在增加它。我的约束是10年以上的只有在RUBY CSV - 我如何总结排序的CSV数据的1列,并确保保持限制或数据的限制

的CSV看起来像这样

id, numbers, years, 
1, 50000, 10 
2, 40000, 12 
3, 50000, 9 

我的红宝石文件看起来像这样

#!/usr/bin/env ruby 

require 'pry' 
require 'rubygems' 
require 'fastercsv' 

mycsv = CSV.read('input.csv', headers:true, col_sep: ', ', header_converters: :symbol, converters: :integer) # read the entire file into a 'loans' variable 


new_mycsv = mycsv.find_all do |p| 
p[:years].between?(10, 12) 
end 

puts new_mycsv.inspect 

#Sum csv data on first row 
new_mycsv.first << "SUM" 


new_mycsv[1..-1].each{|row| row << row.inject(:+)} 

CSV.open("output.csv","w") do |out| 
    new_mycsv.sort_by { |row| each do |row| } 
    p out << row 
end 
end 
+3

这将是很好,如果你可以粘贴输入的预期输出你有。你的问题不清楚。 – AnkitG

+0

我想添加“数字”一栏,基于“年” - 不包括来自“年”的数据,我不需要 – RDavids

回答

1

运行你的代码张贴:

$ ruby -w t_op.rb 
t_op.rb:23: warning: shadowing outer local variable - row 
t_op.rb:23: syntax error, unexpected '}' 
    new_mycsv.sort_by { |row| each do |row| } 
              ^
t_op.rb:26: syntax error, unexpected keyword_end, expecting '}' 

一些对您的代码的评论:

  • 发布无错误的代码,以便我们可以复制粘贴并在其上工作
  • 仅发布回答您的问题所必需的代码。例如

    require 'pry' 
    

    未使用,没有必要解决这个问题发布

  • 运行Ruby与-w选项和纠正警告
  • 这样的说法:

    new_mycsv.first << "SUM" 
    

    会连接"SUM"new_mycsv的第一个元素,导致将数组更改为:

    1,50000,10,SUM 
    2,40000,12 
    
  • 这样的说法:

    new_mycsv[1..-1].each{|row| row << row.inject(:+)} 
    

    忽略第一行并连接东西,其他行,导致阵列更改为:

    1,50000,10 
    2,40000,12,"[:id, 2, :numbers, 40000, :years, 12]" 
    

这里是一个解决方案(我我不确定我是否已经很好地理解了什么not go past a certain number of points的意思):

require 'csv' 

mycsv = CSV.read('input.csv', headers:true, col_sep: ', ', header_converters: :symbol, converters: :integer) # read the entire file into a 'loans' variable 

new_mycsv = mycsv.find_all { | row | row[:years].between?(10, 12) } 

puts '---- new_mycsv' 
puts new_mycsv 

puts '---- selecting rows until the limit of numbers is reached' 
numbers_limit = 100_000 
sum_of_numbers = 0 
mycsv_limited = [] 

new_mycsv.each do | row | 
    number = row[:numbers] 
    puts "row[:numbers]=#{number} sum_of_numbers=#{sum_of_numbers}" 
    break if sum_of_numbers + number >= numbers_limit 
    sum_of_numbers += number 
    puts "sum_of_numbers=#{sum_of_numbers}" 
    mycsv_limited << row 
end 

CSV.open("output.csv","w") do |out| 
    mycsv_limited.sort_by{ | row | row[:numbers] }.each { | row | out.puts row } 
end 

文件input.csv:

id, numbers, years, 
1, 50000, 10 
2, 40000, 12 
3, 50000, 9 
4, 50000, 11 
5, 40000, 11 

执行:

$ ruby -w t.rb 
---- new_mycsv 
1,50000,10 
2,40000,12 
4,50000,11 
5,40000,11 
---- selecting rows until the limit of numbers is reached 
row[:numbers]=50000 sum_of_numbers=0 
sum_of_numbers=50000 
row[:numbers]=40000 sum_of_numbers=50000 
sum_of_numbers=90000 
row[:numbers]=50000 sum_of_numbers=90000 

文件output.csv:

2,40000,12 
1,50000,10 
+0

感谢您的全面反馈 – RDavids