写入csv省略第一行

时间:2016-12-15 07:57:51

标签: ruby-on-rails ruby

我正在使用下面的代码将我的Hashmap编写成带有标题的csv文件。但是,我注意到文件中没有第一个数据行。我可以准确地标题和所有其他行

def self.execute_auto_pg_debtors pg_debtors_dt_list

  partition_key = Date.today.prev_day.prev_day.strftime "%Y%m%d"
  csvfilename = "PG_Debtors_" + partition_key + ".CSV"

  pg_debtors_dt_batch = Array.new 
  rowid = 0

  pg_debtors_dt_list.each { |x|
    pg_debtors_details = Hash.new
    pg_debtors_details["Store_Order_Id"] = x['Store_Order_Id']
    pg_debtors_details["Transaction_Id"] = x['Transaction_Id']
    pg_debtors_details["Gateway_Payment_Id"] = x['Gateway_Payment_Id']
    pg_debtors_details["PPS_Id"] = x['PPS_Id']
    pg_debtors_details["Event_Type"] = x['Event_Type']
    pg_debtors_details["Event_Date"] = x['Event_Date']
    pg_debtors_details["Gateway_Name"] = x['Gateway_Name']
    pg_debtors_details["Open_Amount"] = "%f" % x['Open_Amount']
    pg_debtors_details["Invoice_No"] = x['Invoice_No']

    pg_debtors_dt_batch << pg_debtors_details

    rowid += 1
    if rowid == 1
      CSV.open(csvfilename, "w")  do |csv|
        csv << pg_debtors_details.keys# adding header row (column labels)

    end
  else
      CSV.open(csvfilename, "a")  do |csv|
      csv << pg_debtors_details.values# of if/else inside hsh
  end# of hsh's (rows)
end# of csv open
}

  return pg_debtors_dt_batch
end

请帮忙。

2 个答案:

答案 0 :(得分:1)

您正在编写标题而不是第一行!

我建议您打开文件并遍历CSV.open do ... end

中的哈希值

并且不要在else之后使用if rowid == 1。只需为每个values执行该操作,因此不要跳过数据行1

答案 1 :(得分:1)

即使您检查rowid.each循环仍然不知道它。因此,对于rowid == 1,它会写入标题,但在下一次迭代中,x将指向pg_debtors_dt_list中的第二项。

要解决此问题,请按以下顺序编写代码:

  1. 打开文件,然后先写下标题。
  2. 遍历pg_debtors_dt_list,并将后续数据写入文件。
  3. 希望它有所帮助。