web-dev-qa-db-ja.com

特定のフォルダからすべてのファイルを新しいフォルダにコピーするパッケージを作成するにはどうすればよいですか?

「myfile20-08-2011」のように、ファイル名に現在の日付が含まれるすべてのファイルを含む「Data」というフォルダが1つあります。ここで、08月からのすべてのファイルを収集する [〜#〜] ssis [〜#〜] パッケージを作成します。つまり、ファイルを月ごとに並べ替えてコピーします。それらのファイルを「8月」と呼ばれる新しいフォルダーに入れます。どうやってやるの?

10
Neo

Foreach loop containerScript Task、およびFile System Taskを使用してこれを実現するための1つの解決策を次に示します。これは、ファイルシステムタスクなしで実行できます。ただし、組み込みの制御フロータスクを使用してファイルを移動するために使用しました。この例はSSIS 2005を使用して作成されました。

この例では、ファイルの名前が統一されていると想定しています。したがって、この例ではファイルDD-MM-YYYYの形式を使用しています。たとえば、ファイルの名前はFile 29-07-2011File 15-08-2011などになります。

SSISパッケージで、次の変数を作成します。この例では、ソースファイルはフォルダの場所F:\Temp\に保存されており、ファイルは場所* F:\ Temp\Monthwise *に移動する必要があります。宛先フォルダー内には、7月、8月などの各月のフォルダーがあります。

  • DestinationFolder変数は、F:\Temp\Monthwise\Augustのような最終的な宛先フォルダー値を保持しますが、この変数には、スクリプトタスク内の実際の値が割り当てられます。とりあえず、値F:\Temp\Monthwise\を割り当てましょう。この一時的な値は、ファイルシステムタスクが設計時にエラーメッセージをスローしないようにするためのものです。

  • DestinationRootには、月の名前に基づいて7月、8月などのフォルダーを作成する実際のルートフォルダーが含まれます。

  • 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は、1月、2月などの完全な月の名前でフォルダーを作成することを示します。値MMMを使用すると、フォルダーはJan、Febなどとして作成されます。フォルダーは存在しない場合にのみ作成されます。

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エディターを開き、これらのスクリーンショットの後に提供されたコードを貼り付けます。この例はVS2005で作成されたため、コードはVB.NETで記述されています。これは、SSIS 2005でサポートされている言語がこれだけであるためです。

Script Task General

Script Task Script

Script Task Code

スクリプトタスクコード:コードは変数SourceFilePathから完全なファイルパス値を取得し、ファイル名のみを抽出してローカル変数FileNameに格納します。

次に、MonthStartPositionおよびMonthLength変数に適切なゼロ以外の値が割り当てられているかどうかを確認します。次に、月の値を抽出して、ローカル変数MonthValueに格納します。

MonthValueを使用して、DateTime関数を使用して完全な月の名前の値をフェッチします。月名のみが必要なため、値1は日と年に割り当てられます。

ローカル変数FolderNameの月名は、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を配置します。スクリーンショットに示すように、ファイルシステムタスクを構成します。

File System Task

パッケージタスクを構成すると、[制御フロー]タブは次のようになります。

Control Flow

パッケージをテストしてみましょう。その前に、ソースフォルダF:\ Tempの内容を以下に示します。ファイルはダミーです。したがって、サイズは0 KBです。

F Temp Folder

以下のスクリーンショットは、パッケージが正常に実行されたことを示しています。

Success

以下のスクリーンショットは、月の名前に基づいて作成されたそれぞれの宛先フォルダーにファイルがどのように移動されたかを示しています。各フォルダの内容を以下に示します。

お役に立てば幸いです。

F Temp

F Temp Monthwise

F Temp Monthwise August

F Temp Monthwise January

F Temp Monthwise July

31
user756519