2016-12-15 106 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,並將後續數據寫入文件。

希望它有幫助。