Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
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
Crie e configure um gestor de ligações de ficheiros planos chamado EmptyFlatFileTest.
Crie uma variável inteira nomeada
FFNonDataRowse defina o seu valor para o número de linhas não-dados esperadas no ficheiro plano.Crie uma variável booleana chamada
FFIsEmpty.Adicione a
FFNonDataRowsvariável à propriedade ReadOnlyVariables da tarefa Script.Adicione a
FFIsEmptyvariável à propriedade ReadWriteVariables da tarefa Script.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;
}