2014-11-07 11 views
0

SSIS의 Foreach 루프 컨테이너에서 실행되는 데이터 흐름 태스크에 포함 된 'n 플랫 파일 원본'에서 일치하지 않는 구분 기호를 처리하려고합니다.ForeachLoop 컨테이너의 플랫 파일 소스에서 일치하지 않는 구분 기호 처리

다양한 이름을 가진 하나의 일관된 식별자가있는 폴더에 여러 파일이 있습니다. File23998723.txt File39872397.txt File29387234.txt 등 등 표준 탭이 구분되어야하지만 모든 너무 자주 사용자가 파일을 청소 놓치고 그것이로 구분 될 것이다

이러한 파일, , 또는; 등으로 인해 패키지 가져 오기가 실패하게됩니다.

구분 기호를 동적으로 변경하거나 구분 기호를 미리 테스트하는 쉬운 방법이 있습니까?

Column Delimiter

+0

그것은이다 반드시 쉬운 일은 아니지만 스크립트 작업으로는 무엇이든 할 수 있습니다. –

답변

2

나는 스크립트 작업으로 처리 관리, 감사합니다!

기본적으로 DataFlow 작업 전에 실행되는 Foreach 루프 컨테이너에 스크립트 작업이 추가되었습니다.

나는 변수로 파일 이름을 통해 보내 Script Task Variable

나는 스크립트에 다음 네임 스페이스를 추가 :

using System.IO; 
using RuntimeWrapper = Microsoft.SqlServer.Dts.Runtime.Wrapper; 

그리고 내 스크립트는 다음과 같습니다

public void Main() 
    { 
     if (!string.IsNullOrEmpty(Dts.Variables["sFileName"].Value.ToString())) 
     { 
      StreamReader file = new StreamReader(Dts.Variables["sFileName"].Value.ToString()); 

      if (file != null) 
      { 
       string HeadRowDelimiter = ""; 
       string ColDelimiter = ""; 
       string data = ""; 

       while (file.Peek() >= -1) 
       { 
        char[] c = new char[500]; 
        file.Read(c, 0, c.Length); 

        data = string.Join("", c); 

        if (!string.IsNullOrEmpty(data)) 
        { 
         //set row delimiters 
         if (data.Contains("\r\n")) 
         { 
          HeadRowDelimiter = "\r\n"; 
         } 
         else if (data.Contains("\r")) 
         { 
          HeadRowDelimiter = "\r"; 
         } 
         else if (data.Contains("\n")) 
         { 
          HeadRowDelimiter = "\n"; 
         } 
         else if (data.Contains("\0")) 
         { 
          HeadRowDelimiter = "\0"; 
         } 

         //set column delimiters 
         if (data.Contains("\t")) 
         { 
          ColDelimiter = "\t"; 
         } 
         else if (data.Contains(";")) 
         { 
          ColDelimiter = ";"; 
         } 
         else if (data.Contains(",")) 
         { 
          ColDelimiter = ","; 
         } 
         else if (data.Contains(":")) 
         { 
          ColDelimiter = ":"; 
         } 
         else if (data.Contains("|")) 
         { 
          ColDelimiter = "|"; 
         } 
         else if (data.Contains("\0")) 
         { 
          ColDelimiter = "\0"; 
         } 
        } 

        break; 
       } 
       file.Close(); 

       RuntimeWrapper.IDTSConnectionManagerFlatFile100 flatFileConnection = Dts.Connections["FlatFileConnection"].InnerObject as RuntimeWrapper.IDTSConnectionManagerFlatFile100; 

       if (flatFileConnection != null) 
       { 

        flatFileConnection.HeaderRowDelimiter = HeadRowDelimiter; 
        flatFileConnection.RowDelimiter = HeadRowDelimiter; 
        flatFileConnection.HeaderRowsToSkip = 0; 
        flatFileConnection.Columns[0].ColumnDelimiter = ColDelimiter; 
       } 

       Dts.TaskResult = (int)ScriptResults.Success; 
      } 
     } 
    }