Дата очистки служб 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 даст вам сокращения месяца.

Другие вопросы по тегам