Zjištění prázdného plochého souboru pomocí úlohy skriptu

Platí pro:SQL Server SSIS Integration Runtime v rámci Azure Data Factory

Zdrojový kód plochého souboru neurčuje, zda plochý soubor obsahuje řádky dat, než se pokusí o jeho zpracování. Můžete chtít zvýšit efektivitu balíčku, zejména toho, který iteruje přes mnoho plochých souborů, tím, že přeskočíte soubory, které neobsahují žádné řádky dat. Skriptní úloha může hledat prázdný plochý soubor před tím, než balíček začne zpracovávat datový tok.

Note

Pokud chcete vytvořit úkol, který lze snadněji znovu použít napříč více balíčky, zvažte použití kódu v tomto ukázkovém skriptu úlohy jako výchozího bodu pro vlastní úkol. Další informace naleznete v tématu Vývoj vlastníhoúloh .

Description

Následující příklad využívá metody z jmenného prostoru System.IO k testování plochého souboru specifikovaného ve správci spojení plochých souborů, aby se zjistilo, zda je soubor prázdný, nebo zda obsahuje pouze očekávané nedatové řádky, jako jsou záhlaví sloupců nebo prázdný řádek. Skript nejprve zkontroluje velikost souboru; pokud je velikost nula bajtů, soubor je prázdný. Pokud je velikost souboru větší než nula, skript čte řádky ze souboru, dokud nezmizí další řádky, nebo dokud počet řádků nepřekročí očekávaný počet řádků mimo data. Pokud je počet řádků v souboru menší nebo roven očekávanému počtu řádků bez dat, pak je soubor považován za prázdný. Výsledek je vrácen jako Booleovská hodnota v uživatelské proměnné, jejíž hodnota může být použita pro větvení v řídicím toku balíčku. Metoda FireInformation také zobrazuje výsledky v okně Output v Microsoft Visual Studio Tools for Applications (VSTA).

Pro konfiguraci tohoto příkladu Script Task

  1. Vytvořte a nakonfigurujte správce připojení plochých souborů s názvem EmptyFlatFileTest.

  2. Vytvořte celočíselnou proměnnou pojmenovanou FFNonDataRows a nastavte její hodnotu na počet řádků bez dat, které se očekává v plochém souboru.

  3. Vytvořte Booleovskou proměnnou s názvem FFIsEmpty.

  4. Přidejte proměnnou FFNonDataRows do vlastnosti ReadOnlyVariables ve skriptové úlohě.

  5. Přidejte proměnnou FFIsEmpty do vlastnosti ReadWriteVariables ve skriptním úkolu.

  6. Ve svém kódu importujte System.IO jmenný prostor.

Pokud procházíte soubory pomocí enumerátoru Foreach File místo použití jednoho správce spojení Flat File, budete muset upravit ukázkový kód níže, abyste získali název souboru a cestu z proměnné, ve které je enumerovaná hodnota uložena, místo ze správce spojení.

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