2016-07-06 2 views
0

큰 csv 파일의 데이터를 SSIS를 사용하여 DB 테이블에 복사하려고하지만 클라이언트가 csv 파일의 SubmittedDate 열에 문제가 있습니다 (19.janv. 50 또는 08-AUG-69) db 테이블에 복사 할 수 없습니다 (SubmittedDate는 날짜 임) 날짜를 정리하려면 어떻게합니까? SSIS에서 파생 된 열을 보았습니다.SSIS에서 csv 파일의 날짜를 정리합니다.

이 최고의 솔루션입니까? 어떻게 구성 할 수 있습니까?

+0

이 질문은 프로그래밍 질문이 아닌 비즈니스 규칙 질문이기 때문에 주제를 벗어난 것으로 닫습니다. –

+0

왜 그렇지 않은가? 나는 도움을 찾고 있는데 ... DT_DATE (SUBSTRING ...)의 해결책이있다.하지만 어떻게해야할지 모르겠다. 돕고 싶지 않다면, 다른 사람들이 나를 도와 줄 수있다. – BKChedlia

+0

없다. 누구든지 당신의 질문에 대답하기 전에 당신이이 "엉망"으로 무엇을하고 싶은지에 대한 규칙을 정의 할 필요가 있습니다. –

답변

1

형식이 각 레코드마다 다를 수 있기 때문에 파생 된 열의 경우에는 좋지 않습니다. 원본 데이터가 원래 날짜라는 필드에로드되고 업데이트는 SubmittedDate라는 열에서 실행되는 업데이트로 TSQL을 사용합니다. 또는이 방법을 사용하는 경우 스테이지에서 '라이브'테이블에 삽입하는 동안이 작업을 실행하십시오.

나는 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. 
+0

@Joe 감사합니다. – BKChedlia

0

파생 된 열이이 변환을 수행하는 데 매우 복잡 할 것으로 나는 동의합니다. 일부 형식을 테스트하고 문자열 구문 분석을 수행하기 위해 거대한 SQL 업데이트 문을 작성하는 대신 data flow task에있는 script component을 사용하여 파생 된 열을 변환하고 추가 할 수 있습니다. 이 게시물에 대한 내 대답을 참조하십시오 (그 대답은 VB에서, 나는 일반적으로 C#을하지만 원칙은 동일합니다) 하나를 설정하는 방법에 대한 Convert varchar to datetime using VB script 참조

참고 당신이 SSIS에서 스크립팅을하는 경우 실제로는 스크립트. Script TaskScript 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으로 튀어 나와

당신에게 달 약어를 제공 할 것입니다.

+0

감사합니다. @Matt, 도움을 주신 고객은 CSV (12-OCT-10,09-JAN-13, 22-SEP-13)에서 미국 날짜를 사용한다고 말씀 하셨지만 excel (프랑스어 키보드)을 사용하여 일부 날짜가 변경됩니다. exp 09-JAN-13은 09.janv.13이되고 다른 하나는 날짜가 다른 것과 동일합니다. – BKChedlia

+1

Excel이이를 datetime 필드 및 서식 지정으로 인식하고 있습니다. 귀하의 컴퓨터 문화/세계화 설정에 따라. 메모장과 같은 형식으로 CSV를 열면 텍스트 편집기에서 형식을 변경하지 않으므로 날짜 형식을 볼 수 있습니다. 따라서 클라이언트가 진실을 말하는 경우 DateTime.ParseExact (..., "dd-MMM-yy") 변환 – Matt

+0

덕분에 매트가 나에게, 내 서버에서 언어가 변경되었습니다. – BKChedlia