2011-08-21 51 views

Respuesta

27

Aquí hay una posible solución para lograr esto con la ayuda de Foreach loop container, Script Task y File System Task. Puede hacerlo sin la Tarea del sistema de archivos. Sin embargo, lo he usado para hacer uso de la tarea integrada de flujo de control para mover los archivos. El ejemplo se creó utilizando SSIS 2005.

El ejemplo asume que los archivos se nombrarán uniformemente. Por lo tanto, el ejemplo usa el formato Archivo DD-MM-YYYY. Por ejemplo, los archivos se llamarán File 29-07-2011, File 15-08-2011 etc.

En el paquete SSIS, cree las siguientes variables. En este ejemplo, los archivos fuente se almacenan en la ubicación de la carpeta F:\Temp\ y los archivos se deben mover a la ubicación * F: \ Temp \ Monthwise *. Dentro de la carpeta de destino, habrá carpetas para cada mes como julio, agosto etc.

  • DestinationFolder variable se mantenga el valor final carpeta de destino como F:\Temp\Monthwise\August pero esta variable se asigna con el valor real dentro de la Tarea de script Por ahora, asignemos el valor F:\Temp\Monthwise\. Este valor temporal es evitar que File System Task genere mensajes de error en el momento del diseño.

  • DestinationRoot contendrá la carpeta raíz real bajo la cual se deben crear las carpetas como julio, agosto en función de los nombres de los meses.

  • SourceFolder indica la carpeta en la que se almacenan inicialmente todos los archivos. Aquí, en este ejemplo, la carpeta de origen será F:\Temp\

  • sourcefilepath indica la ruta del archivo real. Esta variable se asignará con los valores de archivo individuales cuando el contenedor de bucles Foreach recorre cada variable. Para evitar que la tarea del sistema de archivos genere mensajes de error en el momento del diseño, vamos a asignarle un valor ficticio F:\Temp\1.txt.

  • FilePattern define el patrón de archivo que se debe recorrer en la ruta de la carpeta de origen. Vamos a asignar *.*, lo que significa que todos los archivos se pasarán en bucle. También puede especificar *.txt o File*.txt o My*.xls etc. Está a la altura de sus requisitos.

  • MonthStartPosition indica la posición donde el valor del mes comienza en el nombre del archivo. Por lo tanto, en el formato de nombre de archivo File 29-07-2011, el mes 07 comienza en el noveno carácter. De ahí el valor 9.

  • MonthLength especifica el número de caracteres para extraer.De todos modos, esto será de 2 caracteres, pero no quería el código difícil. Entonces, creé una variable.

  • MonthNameFormat especifica cómo se deben crear las carpetas. Valor MMMM denota que creará las carpetas con nombres completos de mes como enero, febrero, etc. Si usamos el valor MMM, las carpetas se crearán como enero, febrero, etc. Las carpetas se crearán solo si no existieran.

Variables

En control de flujo pestaña del paquete SSIS, colocar una Foreach loop container y configurarlo para colocar a través de la carpeta especificada en la variable SourceFolder utilizando el patrón de archivo de variables FilePattern. A medida que el contenedor de bucles Foreach recorre los archivos, los nombres de los archivos se asignarán a la variable SourceFilePath. Usaremos esta variable para obtener el valor del mes en Tarea de Script.

Foreach loop container General

Foreach loop container Collection

Foreach loop container Variable Mappings

Dentro del contenedor de bucle Foreach, coloque un botón ... Script Task y la sección de secuencias de comandos de la tarea Script haga clic en el script de Diseño para abrir el editor de VSTA y pegar el código proporcionado después de estas capturas de pantalla. Como el ejemplo se creó en VS 2005, el código está escrito en VB.NET porque es el único idioma admitido en SSIS 2005.

Script Task General

Script Task Script

Script Task Code

Código tarea Script: El código obtiene el valor ruta completa del archivo de la variable SourceFilePath y extrae sólo el nombre de archivo para almacenarlo en la variable local FileName.

A continuación, verifica si las variables MonthStartPosition y MonthLength tienen asignados valores propios distintos de cero. Luego extrae el valor del mes para almacenarlo en la variable local MonthValue.

Al utilizar MonthValue, recupera el valor del nombre de mes completo con la función DateTime. Los valores 1 están asignados a día y año porque solo queremos el nombre del Mes.

El nombre del mes en la variable local NombreCarpeta se combina con el valorDestinationRoot para comprobar si existe o no la carpeta. Si la carpeta no existe, la carpeta se creará para que la Tarea del sistema de archivos no falle.

Finalmente, el valor de la carpeta de destino completo se asigna a la variable del paquete DestinationFolder. Esta variable se usará en la Tarea del sistema de archivos.

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

Dentro del contenedor de bucle Foreach, colocar de archivos del sistema de tareas después de la tarea Script. Configure la tarea del sistema de archivos como se muestra en la captura de pantalla.

File System Task

Una vez que las tareas de paquetes se configuran, la ficha Flujo de control debe ser similar a como se muestra a continuación.

Control Flow

Vamos a probar el paquete. Antes de eso, los contenidos de la carpeta de origen F: \ Temp se muestran a continuación. Los archivos son ficticios. Por lo tanto, el tamaño 0 KB.

F Temp Folder

A continuación pantalla muestra la ejecución exitosa del paquete.

Success

A continuación capturas de pantalla muestran cómo los archivos se han movido a la carpeta de destino correspondiente que se han creado en base a los nombres de los meses. El contenido de las carpetas individuales se muestra a continuación.

Espero que ayude.

F Temp

F Temp Monthwise

F Temp Monthwise August

F Temp Monthwise January

F Temp Monthwise July

Cuestiones relacionadas