将XLS转换为MySQL DB时如何处理坏数据

将XLS转换为MySQL DB时如何处理坏数据,mysql,excel,import,sas,scale,Mysql,Excel,Import,Sas,Scale,我正在进行一个项目,需要将XLS文件中的数据库转换为MySQL。我已经有了可以做到这一点的python代码,但我不确定动态处理边缘情况的正确方法 End Date 04/12/2006 10:00:00 04/12/2006 11:00:00 4/12/2006 13:00:00 PM 例如,我这里有一列日期。显然,我可以在这里手动编辑单元格以匹配其他日期格式,但如果有数千个日期,则无法扩展 我还可以编写python代码来处理这种特定的格式错误的日期格式,但它不适用于其他格式错

我正在进行一个项目,需要将XLS文件中的数据库转换为MySQL。我已经有了可以做到这一点的python代码,但我不确定动态处理边缘情况的正确方法

End Date  
04/12/2006 10:00:00  
04/12/2006 11:00:00  
4/12/2006 13:00:00 PM  
例如,我这里有一列日期。显然,我可以在这里手动编辑单元格以匹配其他日期格式,但如果有数千个日期,则无法扩展

我还可以编写python代码来处理这种特定的格式错误的日期格式,但它不适用于其他格式错误的日期

  for c in range(0,col_names.ncols):
        #Ctype 3 means its a date. 1 is for Text
        if col_names.cell(r,c).ctype == 3:
            raw_time = xlrd.xldate_as_tuple(col_names.cell(r,c).value, book.datemode)
            rowData.append(str(datetime.datetime(*raw_time)))
        else:

            if col_names.cell(r,c).value == 'NULL':
                rowData.append(None)
            elif "PM" in col_names.cell(r,c).value:
                col_names.cell(r,c).value = col_names.cell(r,c).replace("PM","")

            elif "AM" in col_names.cell(r,c).value:
                col_names.cell(r,c).value = col_names.cell(r,c).replace("AM","")

            else:
                rowData.append(col_names.cell(r,c).value)
我尝试在Excel中将此列设置为日期格式。除最后一个单元格外,所有其他单元格都转换为精细单元格

是否有任何程序或方法允许我以正确的格式覆盖此列中的任何日期字符串


像SAS这样的其他程序是否具有更好的动态格式化输入数据的能力?

SAS确实具有几种不同类型的自动日期读取功能

让我们假设您的日期在Excel中的格式正是这样。因为它包含多个日期时间格式,并且最后一个格式被检测为字符,Excel将一些已知日期转换为1900年1月1日以来的天数。SAS将以字符形式读取原始值

End Date
38819.416666667
38819.458333333
4/12/2006 13:00:00 PM
我们可以使用
anydtm.
格式读取各种不同类型的日期时间格式。如果您发现
/
-
,则假定这是Excel无法识别为日期的日期。否则,将Excel datetime调整为SAS datetime(自1960年1月1日起的秒数),方法是将天数减少到1899年12月30日,并使用DHMS()函数将天数转换为秒。之所以使用12月30日而不是1月1日,是因为SAS和Excel在从零算还是从一算上存在分歧,而且Excel错误地认为1900年是闰年

data want;
    set have;

    if(findc('end date'n, '/:- ') ) then end_datetime = input('end date'n, anydtdtm.);
        else end_datetime = dhms('end date'n + '30dec1899'd,0,0,0);

    format end_datetime datetime32.;
run;

这适用于您提供的三个案例。您需要测试其他案例,看看会发生什么。如果Excel将所有内容都识别为日期时间,则无需手动转换为SAS日期时间,并且
proc import
将处理所有内容。

您应该显示现有代码的(相关部分)。请注意,这似乎是使用MySQL的好地方。我只是添加了用于解析日期的部分代码。没有通用方法将所有可能的数据格式解析为日期。最好的解决方案是修复创建excel文件的位置-使日期格式一致。您是迁移一个excel“数据库”还是迁移多个excel“数据库”?如果源数据不确定,则至少需要两个团队分别迁移数据,然后进行比较。如果单元格值确实是日期,删除格式将显示Excel划时代的日期值。以后可以更容易地删除格式并处理Excel日期到MySQL的转换。如果某些日期值是不确定日期表示形式的Excel字符串,则可能必须逐个处理这些值。如果使用SAS导入,则可以尝试任何DTM,但也可能会出现意外行为。它还需要一个CSV文件比XLS文件更容易工作。为什么会有神奇的数字?什么是
-21916
?你是说1899年12月30日?什么是
86400
?你是说24:00:00不是?也许您想使用dhms('end date'n+'30dec1899'd,0,0,0)?这些值来自于SUGI在Excel和SAS日期之间转换的论文:用户撰写的论文是有用的参考资料,但您需要注意理解它们。在这种情况下,论文使用了一种糟糕的编码方式,即使用“魔法”数字。至少在这篇论文中,有几页评论提供了一些背景来帮助理解为什么选择了这些神奇的数字。这并不完全正确。SAS将时间和日期时间存储为秒,但将日期存储为天。Excel将日期存储为天,但将时间部分存储为天的分数。我更新了你的答案来解决这个问题。