我想将数据从大型csv文件复制到数据库表(使用SSIS),但我在csv文件中的列SubmittedDate存在问题,客户端将其弄乱(19.janv.50或08-AUG-69 )所以它不能复制到db表(SubmittedDate是日期) 我该如何清理日期? 我在SSIS中看到了派生列,
这是我最好的解决方案吗?以及如何配置它?
答案 0 :(得分:1)
因为每个记录的格式可能不同,所以我认为这不是派生列的好例子。我会使用TSQL作为更新,其中原始数据被加载到称为原始日期的字段,并且更新在名为SubmittedDate的列上运行。或者,如果您使用此方法,则在从暂存到“实时”表的插入过程中运行。
我将从使用select语句的分析开始,并使用case来确定要使用的解析。继续,直到Submitted(已解析)日期不再为null /空白。希望这可以让你开始:
Select
-- 19.janv.50
Case When CharIndex('.', OriginalDate) = 3
And CharIndex('.', OriginalDate, 4) = 8 Then --Substring code goes here.
-- 08-AUG-69
Case When CharIndex('-', OriginalDate) = 3
And CharIndex('-', OriginalDate, 4) = 7 Then --Substring code goes here.
答案 1 :(得分:0)
我同意Joe的观点,即衍生列可能会非常复杂地进行此转换。编写一个巨大的SQL更新语句来测试某些格式并且必须进行字符串解析的另一种方法是使用script component
中的data flow task
来转换和添加派生列。请参阅我在这篇文章Convert varchar to datetime using VB script上的答案,了解如何设置一个(答案是vb,我通常做c#,但原理是相同的)
请注意,如果您不熟悉SSIS中的脚本,则它们实际上是脚本的两个位置。 Script Task
和Script Component
组件是您想要的,当您在data flow
内时可以看到。
无论您是使用sql staging表(或辅助列)还是使用tSQL来执行转换或编写脚本,您的第一个任务就是确定数据集中表示的标准/格式。第二个决定是当一个值与其中一种已知格式不匹配时该怎么做。
编写脚本的一个关键是DateTime.ParseExact()和DateTime.TryParseExact()。您也可以使用try catch块。基本上尝试使用您识别的格式之一进行转换,并在到达所需的格式时停止。一种方法是使用第二个函数。
坚持使用VB
Private Function ConvertDateString (ByVal dateString As String)
IF DateTime.TryParseExact(dateString,"dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture)
return DateTime.ParseExact(dateString,"dd-MMM-yy", System.Globalization.CultureInfo.InvariantCulture)
END IF
IF DateTime.TryParseExact(dateString,"dd.MMM.yy", System.Globalization.CultureInfo.InvariantCulture)
return DateTime.ParseExact(dateString,"dd.MMM.yy", System.Globalization.CultureInfo.InvariantCulture)
END IF
End Function
IF DateTime.TryParseExact(dateString,"MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture)
return DateTime.ParseExact(dateString,"MM/dd/yyyy", System.Globalization.CultureInfo.InvariantCulture)
END IF
IF DateTime.TryParseExact(dateString,"dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture)
return DateTime.ParseExact(dateString,"dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture)
END IF
...etc
End Function
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
If Not Row.SampleDate_IsNull Then
Row.DerivedDate = ConvertDateString(Row.DateStringColumnName)
End If
End Sub
注意MMM
会给你一个月缩写。