Identifiera en tom flat fil med skriptaktiviteten

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

  1. Skapa och konfigurera en flat file connection manager som heter EmptyFlatFileTest.

  2. Skapa en heltalsvariabel med namnet FFNonDataRows och sätt dess värde till antalet icke-datarader som förväntas i den platta filen.

  3. Skapa en boolesk variabel med namnet FFIsEmpty.

  4. Lägg till variabeln FFNonDataRows i Script-uppgiftens egenskap ReadOnlyVariables .

  5. Lägg till variabeln FFIsEmpty i Script-uppgiftens egenskap ReadWriteVariables .

  6. 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;  
  
        }