Compartilhar via


Detectando um arquivo simples vazio com a tarefa Script

A fonte de arquivo simples não determina se um arquivo simples contém linhas de dados antes de tentar processá-las. Talvez você queira aumentar a eficácia de um pacote, especialmente de um pacote que itera em diversos arquivos simples, ignorando os arquivos que não contêm linhas de dados. A tarefa Script pode procurar um arquivo simples vazio antes de o pacote começar a processar o fluxo de dados.

ObservaçãoObservação

Se desejar criar uma tarefa mais fácil de ser reutilizada em vários pacotes, procure utilizar o código desse exemplo de tarefa Script como o ponto inicial de uma tarefa personalizada. Para obter mais informações, consulte Desenvolvendo uma tarefa personalizada.

Descrição

O exemplo a seguir utiliza métodos do namespace System.IO para testar o arquivo simples especificado em um gerenciador de conexões de arquivos simples a fim de determinar se o arquivo está vazio, ou se ele contém apenas linhas esperadas que não são de dados, tais como títulos de colunas ou uma linha vazia. O script verifica primeiro o tamanho do arquivo; se o tamanho é zero bytes, o arquivo está vazio. Quando o tamanho do arquivo é maior que zero, o script lê linhas do arquivo até não encontrar mais linhas ou até o número de linhas exceder o número esperado de linhas que não são de dados. Quando o número de linhas no arquivo é menor que ou igual ao número esperado de linhas que não são de dados, o arquivo é considerado vazio. Os resultados são retornados como um valor Booleano em uma variável de usuário, cujo valor pode ser usado para criar ramificação no fluxo de controle do pacote. O método FireInformation também exibe o resultado na janela Saída do MicrosoftVisual Studio Tools for Applications (VSTA).

Para configurar esse exemplo de tarefa Script

  1. Crie e configure um gerenciador de conexões de arquivo simples nomeado EmptyFlatFileTest.

  2. Crie uma variável de inteiro nomeada FFNonDataRows e defina seu valor como o número de linhas que não são de dados esperadas no arquivo simples.

  3. Crie uma variável booleana nomeada FFIsEmpty.

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

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

  6. No seu código, importe o namespace System.IO.

Se você estiver iterando em arquivos com um enumerador de arquivo Foreach, em vez de utilizar um único gerenciador de conexões de arquivos simples, modifique o código de exemplo a seguir para obter o nome e o caminho do arquivo a partir da variável em que o valor enumerado é armazenado, e não do gerenciador de conexões.

Código

  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;


        }
Ícone do Integration Services (pequeno) Fique atualizado com o Integration Services

Para obter os mais recentes downloads, artigos, exemplos e vídeos da Microsoft, bem como soluções selecionadas da comunidade, visite a página do Integration Services no MSDN ou TechNet:

Para receber uma notificação automática das atualizações, assine os feeds RSS disponíveis na página.

Consulte também

Conceitos