Вот одно из возможных решений для достижения этой цели с помощью 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, папки будут создаваться как январь, февраль и т. Д. Папки будут создаваться только в том случае, если их не было.
На вкладке Управляющего потока пакета служб SSIS поместите Foreach loop container
и настройте его для циклического перемещения по папке, указанной в переменной SourceFolder
, с использованием переменной шаблона файла FilePattern
. Поскольку контейнер цикла Foreach просматривает файлы, имена файлов будут назначены переменной SourceFilePath . Мы будем использовать эту переменную для получения значения месяца в Задаче сценария.
В контейнере цикла Foreach поместите Script Task
и в разделе «Сценарий» задачи скрипта нажмите кнопку «Сценарий разработки ...», чтобы открыть редактор VSTA и вставить код, предоставленный после этих снимков экрана. Поскольку пример был создан в VS 2005, код написан на VB.NET , потому что это единственный поддерживаемый язык в SSIS 2005
.
Код задачи скрипта: Код получает полное значение пути к файлу из переменной 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.Настройте задачу файловой системы, как показано на снимке экрана.
После настройки задач пакета вкладка «Поток управления» должна выглядеть примерно так, как показано ниже.
Давайте проверим пакет.Перед этим содержимое исходной папки F: \ Temp показано ниже.Файлы являются пустышками.Следовательно, размер 0 КБ.
Ниже скриншот показывает успешное выполнение пакета.
Ниже скриншоты показываюткак файлы были перемещены в соответствующую папку назначения, которая была создана на основе названий месяцев.Содержимое отдельных папок показано ниже.
Надеюсь, что поможет.