Поделиться через


Обнаружение пустого плоского файла в задаче «Сценарий»

Источник данных «плоский файл» не проверяет до начала обработки, содержит ли плоский файл строки данных. Можно повысить эффективность пакета, особенно работающего с многочисленными плоскими файлами, если пропускать файлы, не содержащие строки данных. Задача «Сценарий» может проверять, не является ли плоский файл пустым, до начала обработки пакетом потока данных.

ПримечаниеПримечание

Если нужно создать задачу, которую будет удобно использовать в нескольких пакетах, рекомендуется начать разработку пользовательской задачи с этого образца задачи «Сценарий». Дополнительные сведения см. в разделе Разработка пользовательской задачи.

Описание

В следующем примере методы из пространства имен System.IO используются для проверки плоского файла, заданного в диспетчере соединений с плоскими файлами, чтобы решить, не является ли файл пустым и не состоит ли он только из стандартных рядов без данных (например, заголовков столбцов или пустой строки). Сначала сценарий проверяет размер файла; если размер равен нулю, значит, файл пуст. Если размер файла отличен от нуля, сценарий читает строки из файла, пока они не кончатся или пока число строк не превысит ожидаемое число рядов без данных. Если количество строк в файле меньше или равно ожидаемому числу рядов без данных, то файл считается пустым. Результат возвращается как логическое значение в пользовательской переменной и может использоваться для переключения потока управления пакета. Метод FireInformation также выводит результаты в окне вывода среды разработки средств для приложений MicrosoftVisual Studio (VSTA).

Настройка этого образца задачи «Сценарий»

  1. Создайте и настройте новый диспетчер соединений с плоскими файлами с именем EmptyFlatFileTest.

  2. Создайте переменную целого типа с именем FFNonDataRows и присвойте ей в качестве значения количество ожидаемых в плоском файле строк без данных.

  3. Создайте логическую переменную с именем FFIsEmpty.

  4. Добавьте переменную FFNonDataRows к свойству задачи «Сценарий» ReadOnlyVariables.

  5. Добавьте переменную FFIsEmpty к свойству задачи «Сценарий» ReadWriteVariables.

  6. Импортируйте в код пространство имен System.IO.

При использовании перечислителя с циклом по каждому файлу нужно вместо использования одного диспетчера соединений с плоскими файлами изменить приведенный ниже образец код для получения имени и пути файла из переменной, в которой хранится перечисляемая величина, а не из диспетчера соединений.

Код

  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;


        }
Значок служб Integration Services (маленький)Будьте в курсе новых возможностей cлужб Integration Services

Чтобы загружать новейшую документацию, статьи, образцы и видеоматериалы от корпорации Майкрософт, а также лучшие решения от участников сообщества, посетите страницу Integration Services на сайтах MSDN или TechNet:

Чтобы получать автоматические уведомления об этих обновлениях, подпишитесь на RSS-каналы, предлагаемые на этой странице.

См. также

Основные понятия