「myfile20-08-2011」のように、ファイル名に現在の日付が含まれるすべてのファイルを含む「Data」というフォルダが1つあります。ここで、08月からのすべてのファイルを収集する [〜#〜] ssis [〜#〜] パッケージを作成します。つまり、ファイルを月ごとに並べ替えてコピーします。それらのファイルを「8月」と呼ばれる新しいフォルダーに入れます。どうやってやるの?
Foreach loop container
、Script Task
、およびFile System Task
を使用してこれを実現するための1つの解決策を次に示します。これは、ファイルシステムタスクなしで実行できます。ただし、組み込みの制御フロータスクを使用してファイルを移動するために使用しました。この例はSSIS 2005
を使用して作成されました。
この例では、ファイルの名前が統一されていると想定しています。したがって、この例ではファイルDD-MM-YYYYの形式を使用しています。たとえば、ファイルの名前はFile 29-07-2011
、File 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などとして作成されます。フォルダーは存在しない場合にのみ作成されます。
SSISパッケージの制御フロータブに、Foreach loop container
を配置し、ファイルパターン変数SourceFolder
を使用して、変数FilePattern
で指定されたフォルダーをループするように構成します。 Foreachループコンテナがファイルをループすると、ファイル名が変数SourceFilePathに割り当てられます。この変数を使用して、スクリプトタスクで月の値をフェッチします。
Foreachループコンテナー内にScript Task
を配置し、スクリプトタスクの[スクリプト]セクションで[スクリプトの設計...]ボタンをクリックしてVSTAエディターを開き、これらのスクリーンショットの後に提供されたコードを貼り付けます。この例はVS2005で作成されたため、コードはVB.NETで記述されています。これは、SSIS 2005
でサポートされている言語がこれだけであるためです。
スクリプトタスクコード:コードは変数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を配置します。スクリーンショットに示すように、ファイルシステムタスクを構成します。
パッケージタスクを構成すると、[制御フロー]タブは次のようになります。
パッケージをテストしてみましょう。その前に、ソースフォルダF:\ Tempの内容を以下に示します。ファイルはダミーです。したがって、サイズは0 KBです。
以下のスクリーンショットは、パッケージが正常に実行されたことを示しています。
以下のスクリーンショットは、月の名前に基づいて作成されたそれぞれの宛先フォルダーにファイルがどのように移動されたかを示しています。各フォルダの内容を以下に示します。
お役に立てば幸いです。