在处理包含日期的记录时,我遇到了这个相当特殊的问题。
我正在尝试使用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