从CSV文件将记录插入MySQL数据库时出现奇数日期格式错误

时间:2015-02-20 10:33:48

标签: mysql postgresql datetime csv

在处理包含日期的记录时,我遇到了这个相当特殊的问题。

我正在尝试使用ruby脚本从.csv文件中读取记录并将它们插入到mysql数据库中。

问题是,对于某些csv文件,日期以错误的格式插入,我得到0014/12/31之类的日期。我尽力隔离错误但没有运气。其他csv文件使用完全相同的代码插入就好,并且记录的日期与“31/7/2014”的格式完全相同,并正确保存在我的mysql数据库中。

这是一个奇怪的部分,我打开了CSV文件,这些文件使用我以前使用的默认编辑器,MS Excel,单击日期列来检查日期写入的格式,给我错误以确认其内容,没有改变任何东西并保存文件并退出excel,再次运行脚本,这次它完美运行。

我想也许我通过打开并再次保存来意外地更改了文件,所以我拍了另一个csv文件的截图,在另一个纯文本编辑器(atom)中打开并重新执行相同的步骤,在Excel中打开,保存它和再次运行脚本,日期再次完美保存。

我再次在atom中打开文件并为你们拍了另一张截图,它与之前的图片相同。怎么了?!

解析日期的Ruby代码:

def parse_to_date(param)

  Date.strptime(param,"%d/%m/%Y")
end


puts "REVENUE YTD--------------------------------------------"

CSV.foreach('X_Revenue_YTD.csv') do |row|

  next if row[0] == "Description" || row[0] == "Date" || row[0] == nil

  revenue_ytd_date = parse_to_date(row[0])
  actual_ci_amount = parse_to_int(row[1])
  budget_ci_amount = parse_to_int(row[2])
  actual_ad_amount = parse_to_int(row[3])
  budget_ad_amount = parse_to_int(row[4])
  actual_total_amount = parse_to_int(row[5])
  budget_total_amount = parse_to_int(row[6])
  actual_YTD_ci = parse_to_int(row[7])
  budget_YTD_ci = parse_to_int(row[8])
  actual_YTD_ad = parse_to_int(row[9])
  budget_YTD_ad = parse_to_int(row[10])
  actual_YTD_total = parse_to_int(row[11])
  budget_YTD_total = parse_to_int(row[12])

  insert_statement = <<-eos
    insert into dashboard_finance_revenue_ytd(
      sample_date, revenue_ytd_date, actual_ci_amount, budget_ci_amount,
      actual_ad_amount, budget_ad_amount, actual_total_amount,
      budget_total_amount, actual_YTD_ci, budget_YTD_ci, actual_YTD_ad,
       budget_YTD_ad, actual_YTD_total, budget_YTD_total
    ) values (
      '#{ SAMPLE_DATE }','#{ revenue_ytd_date }', '#{ actual_ci_amount }',
      '#{ budget_ci_amount }', '#{ actual_ad_amount }', '#{ budget_ad_amount     }',
      '#{ actual_total_amount }', '#{ budget_total_amount }', '#{     actual_YTD_ci }',
      '#{ budget_YTD_ci }', '#{ actual_YTD_ad }', '#{ budget_YTD_ad }',
      '#{ actual_YTD_total }', '#{ budget_YTD_total }'
    );
  eos
  conn.exec(insert_statement)
end

0 个答案:

没有答案