Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
SSIS Integration Runtime i Azure Data Factory
Flat File-källan avgör inte om en flat file innehåller rader av data innan den försöker bearbeta den. Du kan vilja förbättra effektiviteten hos ett paket, särskilt ett paket som itererar över många platta filer, genom att hoppa över filer som inte innehåller några datarader. Script-uppgiften kan leta efter en tom flat fil innan paketet börjar bearbeta dataflödet.
Note
Om du vill skapa en uppgift som du lättare kan återanvända över flera paket, överväg att använda koden i detta Script-uppgiftsexempel som utgångspunkt för en anpassad uppgift. Mer information finns i Utveckla en anpassad uppgift.
Description
Följande exempel använder metoder från System.IO namnrymden för att testa den flata fil som specificeras i en Flat File connection manager för att avgöra om filen är tom, eller om den endast innehåller förväntade icke-datarader såsom kolumnhuvuden eller en tom rad. Skriptet kontrollerar först filens storlek; om storleken är noll byte är filen tom. Om filstorleken är större än noll läser skriptet rader från filen tills det inte finns fler rader, eller tills antalet rader överstiger det förväntade antalet rader som inte är data. Om antalet rader i filen är mindre än eller lika med det förväntade antalet rader som inte är data, anses filen vara tom. Resultatet returneras som ett booleskt värde i en användarvariabel, vars värde kan användas för förgrening i paketets kontrollflöde. FireInformation-metoden visar också resultatet i utdatafönstret i Microsoft Visual Studio Tools for Applications (VSTA).
För att konfigurera detta exempel på Script Task
Skapa och konfigurera en flat file connection manager som heter EmptyFlatFileTest.
Skapa en heltalsvariabel med namnet
FFNonDataRowsoch sätt dess värde till antalet icke-datarader som förväntas i den platta filen.Skapa en boolesk variabel med namnet
FFIsEmpty.Lägg till variabeln
FFNonDataRowsi Script-uppgiftens egenskap ReadOnlyVariables .Lägg till variabeln
FFIsEmptyi Script-uppgiftens egenskap ReadWriteVariables .I din kod, importera System.IO namnrymden.
Om du itererar över filer med en Foreach File enumerator, istället för att använda en enda Flat File-anslutningshanterare, måste du ändra exempelkoden nedan för att få filnamnet och sökvägen från variabeln där det uppräknade värdet lagras istället för från anslutningshanteraren.
Kod
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;
}