Дата очистки служб SSIS из CSV-файла
Я хочу скопировать данные из больших файлов CSV в таблицу БД (с помощью SSIS), но у меня есть проблема со столбцом SubmittedDate в файле CSV, в который клиент поместил беспорядок (19.janv.50 или 08-AUG-69), поэтому невозможно скопировать в таблицу базы данных (SubmittedDate is date) Как я могу очистить дату? Я видел производную колонку в SSIS,
это мое лучшее решение? и как я могу это настроить?
2 ответа
Поскольку формат может отличаться для каждой записи, я не думаю, что это хороший случай для производного столбца. Я бы использовал TSQL либо как обновление, где исходные данные загружаются в поле с именем "оригинальная дата", а обновление запускается в столбце с именем SubmittedDate. Или запустите этот процесс во время вставки из промежуточной таблицы в "живую", если вы используете этот подход.
Я бы начал с анализа с использованием оператора select и использовал регистр для определения парсинга, который вы хотите использовать. Продолжайте до тех пор, пока отправленная (проанализированная) дата больше не будет нулевой / пустой. Надеюсь, это поможет вам начать:
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.
Я согласен с Джо, что производная колонка, вероятно, будет очень сложной для этого преобразования. Альтернативой написанию огромного оператора обновления SQL для проверки некоторых форматов и необходимости разбора строк является использование script component
в data flow task
преобразовать и добавить производный столбец. Смотрите мой ответ на этот пост. Конвертируйте varchar в datetime, используя скрипт VB, как его настроить (этот ответ в vb, я обычно делаю C#, но принцип тот же)
Обратите внимание, что если вы новичок в написании сценариев в SSIS, на самом деле это 2 места для сценария. Script Task
а также Script Component
компонент тот, который вы хотите, и будет виден, когда вы находитесь внутри data flow
,
Независимо от того, используете ли вы промежуточную таблицу sql (или дополнительный столбец) и 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
даст вам сокращения месяца.