Как создать пакет, который будет копировать все файлы из данной папки в новую папку? - PullRequest
10 голосов
/ 21 августа 2011

У меня есть одна папка с именем «Данные», которая содержит все файлы с текущей датой в имени файла, например, «myfile 20-08-2011». Теперь я хочу создать пакет SSIS , который собирает все файлы, начиная с 08 месяца, то есть я хочу отсортировать файлы по месяцам и скопировать эти файлы в новую папку с именем «август». Как я могу это сделать?

1 Ответ

31 голосов
/ 21 августа 2011

Вот одно из возможных решений для достижения этой цели с помощью Foreach loop container, Script Task и File System Task. Вы можете сделать это без задачи файловой системы. Тем не менее, я использовал его, чтобы использовать встроенную задачу потока управления для перемещения файлов. Пример был создан с использованием SSIS 2005.

В примере предполагается, что файлы будут называться одинаково. Итак, в примере используется формат Файл DD-MM-YYYY . Например, файлы будут называться File 29-07-2011, File 15-08-2011 и т. Д.

В пакете служб SSIS создайте следующие переменные. В этом примере исходные файлы хранятся в папке F:\Temp\, а файлы должны быть перемещены в папку * F: \ Temp \ Monthwise *. В папке назначения будут папки для каждого месяца, такие как июль, август и т. Д.

  • В переменной DestinationFolder будет храниться конечное значение папки назначения, например F:\Temp\Monthwise\August, но этой переменной будет присвоено фактическое значение в задаче «Сценарий». А пока давайте присвоим значение F:\Temp\Monthwise\. Это временное значение не позволяет Задаче файловой системы генерировать сообщения об ошибках во время разработки.

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

  • SourceFolder обозначает папку, в которой изначально хранятся все файлы. Здесь, в этом примере, исходная папка будет F:\Temp\

  • SourceFilePath обозначает фактический путь к файлу. Эта переменная будет присвоена отдельным значениям файла, когда контейнер цикла Foreach просматривает каждую переменную. Чтобы задача файловой системы не генерировала сообщения об ошибках во время разработки, давайте присвоим ей какое-нибудь фиктивное значение F:\Temp\1.txt.

  • FilePattern определяет шаблон файла, который должен быть зациклен в указанном пути к исходной папке. Давайте назначим *.*, что означает, что все файлы будут зациклены. Вы также можете указать *.txt или File*.txt или My*.xls и т. Д. Это соответствует вашим требованиям.

  • MonthStartPosition обозначает позицию, где значение месяца начинается в имени файла. Итак, в формате имени файла File 29-07-2011 месяц 07 начинается с 9-го символа. Отсюда значение 9.

  • MonthLength указывает количество символов для извлечения. В любом случае это будет 2 символа, но я не хотел писать жесткий код. Итак, я создал переменную.

  • MonthNameFormat указывает, как должны создаваться папки. Значение MMMM означает, что он будет создавать папки с полными названиями месяцев, такими как январь, февраль и т. Д. Если мы используем значение MMM, папки будут создаваться как январь, февраль и т. Д. Папки будут создаваться только в том случае, если их не было.

Variables

На вкладке Управляющего потока пакета служб SSIS поместите Foreach loop container и настройте его для циклического перемещения по папке, указанной в переменной SourceFolder, с использованием переменной шаблона файла FilePattern. Поскольку контейнер цикла Foreach просматривает файлы, имена файлов будут назначены переменной SourceFilePath . Мы будем использовать эту переменную для получения значения месяца в Задаче сценария.

Foreach loop container General

Foreach loop container Collection

Foreach loop container Variable Mappings

В контейнере цикла Foreach поместите Script Task и в разделе «Сценарий» задачи скрипта нажмите кнопку «Сценарий разработки ...», чтобы открыть редактор VSTA и вставить код, предоставленный после этих снимков экрана. Поскольку пример был создан в VS 2005, код написан на VB.NET , потому что это единственный поддерживаемый язык в SSIS 2005.

Script Task General

Script Task Script

Script Task  Code

Код задачи скрипта: Код получает полное значение пути к файлу из переменной SourceFilePath и извлекает только имя файла, чтобы сохранить его в локальной переменной FileName.

Затем проверяется, присвоены ли переменные MonthStartPosition и MonthLength правильные ненулевые значения.Затем он извлекает значение месяца, чтобы сохранить его в локальной переменной MonthValue.

Используя MonthValue, он выбирает полное имя месяца с помощью функции DateTime.Значения 1 назначены дням и годам, потому что нам нужно только имя месяца.

Имя месяца в локальной переменной Имя_папки объединяется со значением DestinationRoot дляпроверьте, существует ли папка или нет.Если папка не существует, папка будет создана таким образом, чтобы задача файловой системы не вызывала сбоев.

Наконец, полное значение папки назначения назначается переменной пакета DestinationFolder.Эта переменная будет использоваться в задаче файловой системы.

VB.NET code for SSIS 2005

Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime

Public Class ScriptMain

    Public Sub Main()

        Dim varCollection As Variables = Nothing
        Dts.VariableDispenser.LockForRead("User::SourceFilePath")
        Dts.VariableDispenser.LockForRead("User::DestinationRoot")
        Dts.VariableDispenser.LockForRead("User::MonthStartPosition")
        Dts.VariableDispenser.LockForRead("User::MonthLength")
        Dts.VariableDispenser.LockForRead("User::MonthNameFormat")
        Dts.VariableDispenser.LockForWrite("User::DestinationFolder")
        Dts.VariableDispenser.GetVariables(varCollection)

        Dim SourceFilePath As String = varCollection("User::SourceFilePath").Value.ToString()
        Dim FileName As String = SourceFilePath.Substring(SourceFilePath.LastIndexOf("\") + 1)
        Dim DestinationRoot As String = varCollection("User::DestinationRoot").Value.ToString()
        Dim MonthStartPosition As Integer = Convert.ToInt32(varCollection("User::MonthStartPosition").Value)
        Dim MonthLength As Integer = Convert.ToInt32(varCollection("User::MonthLength").Value)
        Dim MonthValue As Integer = 0
        Dim MonthNameFormat As String = varCollection("User::MonthNameFormat").Value.ToString()
        Dim FolderName As String = String.Empty
        Dim MonthwiseDirectory As String = String.Empty

        If MonthStartPosition > 0 AndAlso MonthLength > 0 Then
            MonthValue = Convert.ToInt32(FileName.Substring(MonthStartPosition - 1, MonthLength))
        End If

        If FileName.Length > 0 AndAlso MonthValue > 0 Then
            FolderName = New DateTime(1, MonthValue, 1).ToString(MonthNameFormat)
        End If

        MonthwiseDirectory = System.IO.Path.Combine(DestinationRoot, FolderName)

        If Not System.IO.Directory.Exists(MonthwiseDirectory) Then
            System.IO.Directory.CreateDirectory(MonthwiseDirectory)
        End If

        varCollection("User::DestinationFolder").Value = MonthwiseDirectory

        Dts.TaskResult = Dts.Results.Success
    End Sub

End Class

C# code for SSIS 2008 and above

public void Main()
{
    Variables varCollection = null;
    Dts.VariableDispenser.LockForRead("User::SourceFilePath");
    Dts.VariableDispenser.LockForRead("User::DestinationRoot");
    Dts.VariableDispenser.LockForRead("User::MonthStartPosition");
    Dts.VariableDispenser.LockForRead("User::MonthLength");
    Dts.VariableDispenser.LockForRead("User::MonthNameFormat");
    Dts.VariableDispenser.LockForWrite("User::DestinationFolder");
    Dts.VariableDispenser.GetVariables(ref varCollection);

    string SourceFilePath = varCollection["User::SourceFilePath"].Value.ToString();
    string FileName = SourceFilePath.Substring(SourceFilePath.LastIndexOf('\\') + 1);
    string DestinationRoot = varCollection["User::DestinationRoot"].Value.ToString();
    int MonthStartPosition = Convert.ToInt32(varCollection["User::MonthStartPosition"].Value);
    int MonthLength = Convert.ToInt32(varCollection["User::MonthLength"].Value);
    int MonthValue = 0;
    string MonthNameFormat = varCollection["User::MonthNameFormat"].Value.ToString();
    string FolderName = string.Empty;
    string MonthwiseDirectory = string.Empty;

    if (MonthStartPosition > 0 && MonthLength > 0)
    {
        MonthValue = Convert.ToInt32(FileName.Substring(MonthStartPosition - 1, MonthLength));
    }

    if (FileName.Length > 0 && MonthValue > 0)
    {
        FolderName = new DateTime(1, MonthValue, 1).ToString(MonthNameFormat);
    }

    MonthwiseDirectory = System.IO.Path.Combine(DestinationRoot, FolderName);

    if (!System.IO.Directory.Exists(MonthwiseDirectory))
    {
        System.IO.Directory.CreateDirectory(MonthwiseDirectory);
    }

    varCollection["User::DestinationFolder"].Value = MonthwiseDirectory;

    Dts.TaskResult = (int)ScriptResults.Success;
}

В контейнере цикла Foreach поместите File System Task после задачи Script.Настройте задачу файловой системы, как показано на снимке экрана.

File System Task

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

Control Flow

Давайте проверим пакет.Перед этим содержимое исходной папки F: \ Temp показано ниже.Файлы являются пустышками.Следовательно, размер 0 КБ.

F Temp Folder

Ниже скриншот показывает успешное выполнение пакета.

Success

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

Надеюсь, что поможет.

F Temp

F Temp Monthwise

F Temp Monthwise August

F Temp Monthwise January

F Temp Monthwise July

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...