Betik Göreviyle Boş Bir Düz Dosyayı Algılama

Şunlar için geçerlidir:SQL Server Azure Data Factory'de SSIS Tümleştirme Çalışma Zamanı

Düz Dosya kaynağı, düz dosyanın işlem yapmadan önce veri satır içerip içermediğini belirlemez. Özellikle çok sayıda düz dosya üzerinde yineleme yapan bir paketin verimliliğini, veri satırı içermeyen dosyaları atlayarak artırmak isteyebilirsiniz. Script görevi, paket veri akışını işlemeye başlamadan önce boş düz bir dosya arayabilir.

Note

Birden fazla paket arasında daha kolay yeniden kullanabileceğiniz bir görev oluşturmak istiyorsanız, bu Script görev örneğindeki kodu özel bir görev için başlangıç noktası olarak kullanmayı düşünün. Daha fazla bilgi için bkz. Özel Görev geliştirme.

Description

Aşağıdaki örnek, System.IO isim alanından metodlar kullanarak Flat File bağlantı yöneticisinde belirtilen düz dosyayı test ederek, dosyanın boş olup olmadığını veya sadece sütun başlıkları veya boş satır gibi beklenen veri dışı satırları içerip içermediğini belirlemektir. Script önce dosyanın boyutunu kontrol eder; Boyut sıfır bayt ise, dosya boş olur. Dosya boyutu sıfırdan büyükse, script satır sayısı kalana veya satır sayısı beklenen veri dışı satır sayısını aşana kadar dosyadan satırları okur. Dosyadaki satır sayısı, beklenen veri dışı satır sayısından az veya eşitse, dosya boş sayılır. Sonuç, paketin kontrol akışında dallanma için kullanılabilen bir kullanıcı değişkeninde bir Boolean değeri olarak döner. FireInformation yöntemi ayrıca sonucu Microsoft Visual Studio Apps for Applications (VSTA) Tools for Applications'ın Çıkış penceresinde gösterir.

Bu Script Görevi örneğini yapılandırmak için

  1. EmptyFlatFileTest adlı düz bir dosya bağlantı yöneticisi oluşturun ve yapılandırın.

  2. Adını FFNonDataRows taşıyan bir tamsayı değişkeni oluşturun ve değerini, düz dosyada beklenen veri dışı satır sayısına ayarlayın.

  3. Adı FFIsEmptyolan bir Boolean değişkeni oluşturun.

  4. Değişkeni FFNonDataRows Script görevinin ReadOnlyVariables özelliğine ekleyin.

  5. Değişkeni FFIsEmpty Script görevinin ReadWriteVariables özelliğine ekleyin.

  6. Kodunuzda System.IO isim alanını içe aktarın.

Dosyaları Foreach Dosya hesaplayıcısı ile yineleme yapıyorsanız, tek bir Flat File bağlantı yöneticisi kullanmak yerine, aşağıdaki örnek kodu değiştirerek dosya adını ve yolu bağlantı yöneticisinden değil, sayılan değerin saklandığı değişkenden almanız gerekir.

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