Ruby 如何压缩/简化从csv文件中提取数据的这段代码?

Ruby 如何压缩/简化从csv文件中提取数据的这段代码?,ruby,csv,Ruby,Csv,我有一段代码,它从csv文件中提取数据,然后重新格式化,以便与另一个数据集进行比较: def dataExtract dates = File.open(@filename_data).read.scan /\d{2}\/\d{2}\/\d{2}/ data_extracted = [] index = 0 dates.each do |date| inbound_row = @data[4+(11*index)] outbound_row = @data[6+(

我有一段代码,它从csv文件中提取数据,然后重新格式化,以便与另一个数据集进行比较:

def dataExtract
  dates = File.open(@filename_data).read.scan /\d{2}\/\d{2}\/\d{2}/
  data_extracted = []
  index = 0
  dates.each do |date|
    inbound_row = @data[4+(11*index)]
    outbound_row = @data[6+(11*index)]
    data_extracted.push [date, '4001', (inbound_row[1].gsub(/\,/,"").to_i + inbound_row[2].gsub(/\,/,"").to_i).to_s, 'AI', 'INBOUND']
    data_extracted.push [date, '4090', inbound_row[3].gsub(/\,/,""), 'AI', 'INBOUND']
    data_extracted.push [date, '1139', inbound_row[4].gsub(/\,/,""), 'RU STANDRD', 'INBOUND']
    data_extracted.push [date, '1158', inbound_row[5].gsub(/\,/,""), 'RU STANDRD', 'INBOUND']
    data_extracted.push [date, '4055', outbound_row[1].gsub(/\,/,""), 'RU PLUS', 'OUTBOUND']
    data_extracted.push [date, '4055', outbound_row[2].gsub(/\,/,""), 'AR', 'OUTBOUND']
    data_extracted.push [date, '1139', outbound_row[4].gsub(/\,/,""), 'RU STANDRD', 'OUTBOUND']
    data_extracted.push [date, '1158', outbound_row[5].gsub(/\,/,""), 'RU STANDRD', 'OUTBOUND']
    data_extracted.push [date, '4091', outbound_row[3].gsub(/\,/,""), 'RU STANDRD', 'OUTBOUND']
    index += 1
  end
  return data_extracted   
end
下面是csv数据的一个示例(这是一天的数据。在多天的时间里,有这样的块,它们之间有一个空白):

此csv文件中使用的唯一数据(日期除外)是已排序和已发货的行。不管怎样,就像我说的,这很有效,只是不太好看。有没有更好的方法来执行dates.each块,因为有重复的信息(日期在每个数组中+入站/出站)?

替换
文件。打开(文件名)。用
文件读取
。读取(文件名)
,并使用
每个而不是
索引+=1
,最后去掉冗余的
return
,方法名使用
snake\u case

def data_extract
  dates = File.read(@filename_data).scan /\d{2}\/\d{2}\/\d{2}/
  data_extracted = []
  dates.each_with_index do |date, index|
    inbound_row = @data[4+(11*index)]
    outbound_row = @data[6+(11*index)]
    data_extracted.push [date, '4001', (inbound_row[1].gsub(/\,/,"").to_i + inbound_row[2].gsub(/\,/,"").to_i).to_s, 'AI', 'INBOUND']
    data_extracted.push [date, '4090', inbound_row[3].gsub(/\,/,""), 'AI', 'INBOUND']
    data_extracted.push [date, '1139', inbound_row[4].gsub(/\,/,""), 'RU STANDRD', 'INBOUND']
    data_extracted.push [date, '1158', inbound_row[5].gsub(/\,/,""), 'RU STANDRD', 'INBOUND']
    data_extracted.push [date, '4055', outbound_row[1].gsub(/\,/,""), 'RU PLUS', 'OUTBOUND']
    data_extracted.push [date, '4055', outbound_row[2].gsub(/\,/,""), 'AR', 'OUTBOUND']
    data_extracted.push [date, '1139', outbound_row[4].gsub(/\,/,""), 'RU STANDRD', 'OUTBOUND']
    data_extracted.push [date, '1158', outbound_row[5].gsub(/\,/,""), 'RU STANDRD', 'OUTBOUND']
    data_extracted.push [date, '4091', outbound_row[3].gsub(/\,/,""), 'RU STANDRD', 'OUTBOUND']
  end
  data_extracted   
end

也许更简单,也许不简单-但希望足够给你一个如何继续改进它的想法

data_extracted = []

inbound_data_set = [['4090',3,'AI'],['1139',4,'RU STANDRD'],['1158',5,'RU STANDRD']]
outbound_data_set = [['4055',1,'RU PLUS'],['4055',2,'AR'],['1139',4,'RU STANDRD'],['1158',5,'RU STANDRD'],['4091',3,'RU STANDRD']]

dates.each_with_index do |date,index|
  inbound_row = @data[4+(11*index)]
  outbound_row = @data[6+(11*index)]
  # this one stays as it's much different
  data_extracted << [date, '4001', (inbound_row[1].gsub(/\,/,"").to_i + inbound_row[2].gsub(/\,/,"").to_i).to_s, 'AI', 'INBOUND']
  inbound_data_set.each do |num,idx,type|
    data_extracted << [date, num, (inbound_row[idx].gsub(/\,/,"")), type, 'INBOUND']
  end
  outbound_data_set.each do |num,idx,type|
    data_extracted << [date, num, (outbound_row[idx].gsub(/\,/,"")), type, 'OUTBOUND']
  end
end
提取的数据=[]
入站数据集=['4090',3,'AI'],['1139',4,'RU STANDRD'],['1158',5,'RU STANDRD']
出站数据集=['4055',1,'RU PLUS'],['4055',2,'AR'],['1139',4,'RU STANDRD'],['1158',5,'RU STANDRD'],['4091',3,'RU STANDRD']
dates.each_with_index do| date,index|
入站_行=@data[4+(11*索引)]
出站_行=@data[6+(11*索引)]
#这一个保持不变,因为它非常不同

提取的数据不知道您想要实现什么。。。可以将提取的
日期\u数组替换为名为
入站
出站
的两个数组,这是一个开始。如果第一行包含列标题,则每个列都应该有一个。这真的不重要,但看起来更好,可能会派上用场。谢谢!这就是我想要的那种简化/简化!
data_extracted = []

inbound_data_set = [['4090',3,'AI'],['1139',4,'RU STANDRD'],['1158',5,'RU STANDRD']]
outbound_data_set = [['4055',1,'RU PLUS'],['4055',2,'AR'],['1139',4,'RU STANDRD'],['1158',5,'RU STANDRD'],['4091',3,'RU STANDRD']]

dates.each_with_index do |date,index|
  inbound_row = @data[4+(11*index)]
  outbound_row = @data[6+(11*index)]
  # this one stays as it's much different
  data_extracted << [date, '4001', (inbound_row[1].gsub(/\,/,"").to_i + inbound_row[2].gsub(/\,/,"").to_i).to_s, 'AI', 'INBOUND']
  inbound_data_set.each do |num,idx,type|
    data_extracted << [date, num, (inbound_row[idx].gsub(/\,/,"")), type, 'INBOUND']
  end
  outbound_data_set.each do |num,idx,type|
    data_extracted << [date, num, (outbound_row[idx].gsub(/\,/,"")), type, 'OUTBOUND']
  end
end