2016-12-15 56 views
0

我正在使用下面的一段代码将我的Hashmap写入带有标题的csv文件。但是,我注意到第一个数据行在文件中不可用。我可以准确地标题和所有其他行写入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 

请帮助。

回答

1

您正在写头而不是第一行!

我建议,你打开文件,并通过您的哈希CSV.open do ... end

内迭代和你if rowid == 1后不使用else。只需对每个values执行该操作,这样就不会跳过数据行1

1

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

为了解决这个问题,按照下面的顺序编写代码:

  1. 打开该文件,先写头。
  2. 循环通过pg_debtors_dt_list,并将后续数据写入文件。

希望它有帮助。