Detectando um ficheiro plano vazio com a Tarefa de Script

Aplica-se a: SQL Server SSIS Integration Runtime em Azure Data Factory

A fonte do ficheiro plano não determina se um ficheiro plano contém linhas de dados antes de tentar processá-lo. Pode querer melhorar a eficiência de um pacote, especialmente de um que itera sobre vários ficheiros planos, saltando ficheiros que não contenham linhas de dados. A tarefa Script pode procurar um ficheiro plano vazio antes de o pacote começar a processar o fluxo de dados.

Note

Se quiser criar uma tarefa que possa reutilizar mais facilmente em vários pacotes, considere usar o código deste exemplo de tarefa Script como ponto de partida para uma tarefa personalizada. Para obter mais informações, consulte Desenvolvendo uma tarefa personalizada.

Description

O exemplo seguinte utiliza métodos do espaço de nomes System.IO para testar o ficheiro plano especificado num gestor de ligação de ficheiros planos para determinar se o ficheiro está vazio ou se contém apenas linhas esperados que não são de dados, como cabeçalhos de coluna ou uma linha vazia. O script verifica primeiro o tamanho do ficheiro; Se o tamanho for zero bytes, o ficheiro fica vazio. Se o tamanho do ficheiro for maior que zero, o script lê linhas do ficheiro até que não haja mais linhas, ou até que o número de linhas exceda o esperado número de linhas não relacionadas com dados. Se o número de linhas no ficheiro for inferior ou igual ao número esperado de linhas não-dados, então o ficheiro é considerado vazio. O resultado é devolvido como um valor booleano numa variável de utilizador, cujo valor pode ser usado para ramificação no fluxo de controlo do pacote. O método FireInformation também apresenta o resultado na janela de Saída do Microsoft Visual Studio Tools for Applications (VSTA).

Para configurar este exemplo de Tarefa de Script

  1. Crie e configure um gestor de ligações de ficheiros planos chamado EmptyFlatFileTest.

  2. Crie uma variável inteira nomeada FFNonDataRows e defina o seu valor para o número de linhas não-dados esperadas no ficheiro plano.

  3. Crie uma variável booleana chamada FFIsEmpty.

  4. Adicione a FFNonDataRows variável à propriedade ReadOnlyVariables da tarefa Script.

  5. Adicione a FFIsEmpty variável à propriedade ReadWriteVariables da tarefa Script.

  6. No teu código, importa o espaço de nomes System.IO .

Se estiver a iterar sobre ficheiros com um enumerador Foreach File, em vez de usar um único gestor de ligações Flat File, terá de modificar o código de exemplo abaixo para obter o nome e o caminho do ficheiro a partir da variável onde o valor enumerado está armazenado, em vez do gestor de conexões.

Code

Public Sub Main()  
  
  Dim nonDataRows As Integer = _  
      DirectCast(Dts.Variables("FFNonDataRows").Value, Integer)  
  Dim ffConnection As String = _  
      DirectCast(Dts.Connections("EmptyFlatFileTest").AcquireConnection(Nothing), _  
      String)  
  Dim flatFileInfo As New FileInfo(ffConnection)  
  ' If file size is 0 bytes, flat file does not contain data.  
  Dim fileSize As Long = flatFileInfo.Length  
  If fileSize > 0 Then  
    Dim lineCount As Integer = 0  
    Dim line As String  
    Dim fsFlatFile As New StreamReader(ffConnection)  
    Do Until fsFlatFile.EndOfStream  
      line = fsFlatFile.ReadLine  
      lineCount += 1  
      ' If line count > expected number of non-data rows,  
      '  flat file contains data (default value).  
      If lineCount > nonDataRows Then  
        Exit Do  
      End If  
      ' If line count <= expected number of non-data rows,  
      '  flat file does not contain data.  
      If lineCount <= nonDataRows Then  
        Dts.Variables("FFIsEmpty").Value = True  
      End If  
    Loop  
  Else  
    Dts.Variables("FFIsEmpty").Value = True  
  End If  
  
  Dim fireAgain As Boolean = False  
  Dts.Events.FireInformation(0, "Script Task", _  
      String.Format("{0}: {1}", ffConnection, _  
      Dts.Variables("FFIsEmpty").Value.ToString), _  
      String.Empty, 0, fireAgain)  
  
  Dts.TaskResult = ScriptResults.Success  
  
End Sub  
public void Main()  
        {  
  
            int nonDataRows = (int)(Dts.Variables["FFNonDataRows"].Value);  
            string ffConnection = (string)(Dts.Connections["EmptyFlatFileTest"].AcquireConnection(null) as String);  
            FileInfo flatFileInfo = new FileInfo(ffConnection);  
            // If file size is 0 bytes, flat file does not contain data.  
            long fileSize = flatFileInfo.Length;  
            if (fileSize > 0)  
            {  
  
                int lineCount = 0;  
                string line;  
                StreamReader fsFlatFile = new StreamReader(ffConnection);  
                while (!(fsFlatFile.EndOfStream))  
                {  
                    Console.WriteLine (fsFlatFile.ReadLine());  
                    lineCount += 1;  
                    // If line count > expected number of non-data rows,  
                    //  flat file contains data (default value).  
                    if (lineCount > nonDataRows)  
                    {  
                        break;  
                    }  
                    // If line count <= expected number of non-data rows,  
                    //  flat file does not contain data.  
                    if (lineCount <= nonDataRows)  
                    {  
                        Dts.Variables["FFIsEmpty"].Value = true;  
                    }  
                }  
            }  
            else  
            {  
                Dts.Variables["FFIsEmpty"].Value = true;  
            }  
  
            bool fireAgain = false;  
            Dts.Events.FireInformation(0, "Script Task", String.Format("{0}: {1}", ffConnection, Dts.Variables["FFIsEmpty"].Value), String.Empty, 0, ref fireAgain);  
  
            Dts.TaskResult = (int)ScriptResults.Success;  
  
        }