我有一個名爲'Data'的文件夾,其中包含文件名中當前日期的所有文件,例如'myfile 20-08-2011'。現在我想創建一個SSIS軟件包,它收集所有從08月份開始的文件,也就是說,我想按月清理文件,並將這些文件複製到一個名爲「august」的新文件夾中。我怎樣才能做到這一點?如何創建將所有文件從給定文件夾複製到新文件夾的軟件包?
回答
下面是在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將包含實際的根文件夾,在該文件夾下應根據月份名稱創建像July,August這樣的文件夾。
源文件夾表示最初存儲所有文件的文件夾。在此示例中,源文件夾將爲
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,則文件夾將創建爲1月,2月等。只有文件夾不存在時纔會創建文件夾。
在SSIS包的控制流標籤上,放置一個Foreach loop container
並通過使用可變FilePattern
文件模式在變量SourceFolder
指定的文件夾將其配置爲環路。當Foreach循環容器遍歷文件時,文件名將被分配給變量SourceFilePath。我們將使用此變量來獲取腳本任務中的月份值。
在foreach循環容器,放置Script Task
和腳本任務的腳本部分單擊設計腳本...按鈕打開VSTA編輯和粘貼在這些屏幕截圖之後提供的代碼。由於該示例是在VS 2005中創建的,因此代碼編寫爲VB.NET,因爲這是SSIS 2005
中唯一受支持的語言。
腳本任務代碼:的代碼從變量SourceFilePath
完整的文件路徑值,而僅提取文件名,將其存儲在局部變量FileName
。
然後檢查MonthStartPosition
和MonthLength
變量是否分配有適當的非零值。然後提取月份值以將其存儲在本地變量MonthValue
中。
Uisng 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循環容器,放置文件系統任務腳本任務後。如屏幕截圖所示配置文件系統任務。
一旦包裝任務被配置爲,控制流選項卡應該看起來像如下所示。
我們來測試包。在此之前,源文件夾F:\ Temp的內容如下所示。這些文件是虛擬的。因此,大小爲0 KB。
下面的屏幕截圖示出了包裝的成功執行。
下面的截圖顯示瞭如何將文件已經被移動到已根據本月名稱來創建相應的目標文件夾。下面顯示了各個文件夾的內容。
希望有所幫助。
- 1. 將文件夾從文件夾複製到文件夾python
- 2. 將文件夾複製到文件夾
- 3. 創建文件夾結構並將文件複製到特定文件夾中
- 4. Jenkins如何從給定文件夾複製新文件
- 5. 將包含文件夾中特定文本的文件從文件夾複製到其他文件夾
- 6. 將文件夾從一個文件夾複製到一個新文件夾
- 7. 如何創建一個包,將所有文件從給定的文件夾複製到一個新的文件夾,並使用SSIS
- 8. 將文件從源文件夾複製到目標文件夾
- 9. 將文件複製到所有文件夾批處理文件?
- 10. powershell複製文件夾中的所有文件夾和文件
- 11. 將一個文件複製到文件夾中的所有文件夾?
- 12. 如何將舊文件夾複製到新文件夾並重命名新文件夾中的文件
- 13. 如何通過更改文件名將所有文件從一個ftp文件夾複製到sftp文件夾
- 14. 將文件從目錄中的文件夾複製到新文件夾
- 15. 將文件夾中的所有文件複製到文檔中
- 16. 將文件從/文件複製到/文件夾/文件
- 17. iphone將文件夾從文件夾複製到文檔
- 18. 如何將一百個文件從文件夾複製到文件夾?
- 19. 如何將文件從一個文件夾複製到另一個文件夾
- 20. 創建隨機文件夾,複製到隨機文件夾
- 21. makecab - 從文件夾中的所有文件創建cab文件
- 22. 試圖創建$ now文件夾並複製.sql文件創建的文件夾
- 23. 如何從給定文件夾中的所有文件讀取?
- 24. 如何將一個文件夾複製到文件夾的所有其他子文件夾?
- 25. 如何將一個文件夾複製到另一個文件夾的所有子文件夾
- 26. 將.tar.gz文件複製到文件夾
- 27. 將文件複製到文件夾
- 28. VBA從文件夾中的所有文件複製工作表並將其複製到主文件夾
- 29. 如何將文件從URL複製到文檔文件夾?
- 30. 複製所有文件遞歸到一個文件夾(無需重新創建文件夾)