2017-10-15 20 views
0

这里是我的样东西:建立一个CSV与4列和2个变量

my_csv_to_export = CSV.generate do |csv| 
     csv << %w(dates orders) 
     orders.each do |elem| 
      csv << elem 
     end 
     csv << %w(dates sales) 
     sales.each do |elem| 
      csv << elem 
     end 
    end 

CSV是确定的,但只有2列,我需要标题%W(日期订单日期销售)的4列

有人有线索吗?我会拥有你一品脱

回答

0

在你的一块Ruby代码中,你已经插入了每行2列的行。因此,最初插入订单中的记录,并在其下插入销售中的记录。如果您需要它们并排放置,则可以在订单和第i行销售中读取第i行,将它们合并为一行4列并插入到CSV中。

my_csv_to_export = CSV.generate do |csv| 
    header = %w(dates orders dates sales) 
    csv << header 
    padding_row = ["", ""] 
    total_number_of_rows = [orders.size, sales.size].max 

    # If one array contains more rows than other, 
    # fill the empty row with the padding_row so that 
    # the alignment of records in the CSV is preserved. 

    (0..(total_number_of_rows - 1)).each do |row_index| 
     current_row = (orders[row_index] || padding_row) + (sales[row_index] || padding_row) 
     csv << current_row 
    end 
end 

如果阵列即订单和销售已经包含在日期的顺序的条目,那么你可以只更换下面两个赋值语句。

header = %w(dates orders sales) 
. 
. 
. 
current_row = (orders[row_index] || padding_row) + [(sales[row_index] || padding_row)[1]] 

更好的解决方案是从日期到订单和从日期到销售的另一个地图创建地图。然后,日期可用于从订单地图和销售地图中获取订单,前提是格式的日期在两个数组中都是相同的

my_csv_to_export = CSV.generate do |csv| 
    header = %w(dates orders sales) 
    csv << header 

    // The following code assumes that there is only one order/sale per date. 
    orders_map = orders.index_by { |order| order[0] } // Use the first column of the array i.e date as the key to the map. 
    sales_map = sales.index_by { |sale| sale[0] } 
    unique_dates = (orders_map.keys + sales_map.keys).uniq 

    unique_dates.each do |date| 
     csv << [date, orders[date] || "", sales[date] || ""] 
    end 
end 
+0

完美的作品Aravind,谢谢!如果我不希望日期重复,那么呢? Like: header =%w(日期订单销售) –

+0

@YannFroment请参阅最新的答案。 –

+0

非常感谢这个更新! –