2011-08-21 41 views
7

Tôi có một thư mục có tên 'Dữ liệu' có chứa tất cả các tệp có ngày hiện tại trong tên tệp như ví dụ 'myfile 20-08-2011'. Bây giờ tôi muốn tạo một gói SSIS thu thập tất cả các tệp từ tháng 08, tức là, tôi muốn phân loại tệp theo tháng khôn ngoan và sao chép các tệp đó vào một thư mục mới có tên là "august". Làm thế nào tôi có thể làm điều đó?Làm cách nào để tạo một gói có thể sao chép tất cả các tệp từ một thư mục nhất định sang một thư mục mới?

Trả lời

27

Dưới đây là một giải pháp khả thi để đạt được điều này với sự trợ giúp của Foreach loop container, Script TaskFile System Task. Bạn có thể thực hiện tác vụ này mà không cần tệp Hệ thống tệp. Tuy nhiên, tôi đã sử dụng nó để tận dụng nhiệm vụ dòng điều khiển được xây dựng sẵn để di chuyển các tệp. Ví dụ này được tạo bằng cách sử dụng SSIS 2005.

Ví dụ giả định rằng các tệp sẽ được đặt tên thống nhất. Vì vậy, ví dụ sử dụng định dạng Tệp DD-MM-YYYY. Ví dụ: các tệp sẽ được đặt tên là File 29-07-2011, File 15-08-2011 v.v.

Trên gói SSIS, hãy tạo các biến sau. Trong ví dụ này, các tệp nguồn được lưu trữ ở vị trí thư mục F:\Temp\ và các tệp sẽ được di chuyển đến vị trí * F: \ Temp \ Monthwise *. Trong thư mục đích, sẽ có thư mục cho mỗi tháng như Bảy, Tám, vv

  • DestinationFolder biến sẽ giữ giá trị thư mục đích cuối cùng như F:\Temp\Monthwise\August nhưng biến này sẽ được gán với giá trị thực tế bên trong Tác vụ tập lệnh. Bây giờ, hãy gán giá trị F:\Temp\Monthwise\. Giá trị tạm thời này là để tránh tệp hệ thống tác vụ từ việc ném thông báo lỗi vào thời gian thiết kế.

  • DestinationRoot sẽ chứa thư mục gốc thực tế mà theo đó các thư mục như tháng 7, tháng 8 sẽ được tạo dựa trên tên tháng.

  • SourceFolder biểu thị thư mục trong đó tất cả các tệp được lưu trữ ban đầu. Ở đây trong ví dụ này, thư mục nguồn sẽ là F:\Temp\

  • SourceFilePath biểu thị đường dẫn tệp thực tế. Biến này sẽ được gán với các giá trị tệp riêng lẻ khi vùng chứa vòng lặp Foreach lặp qua từng biến. Để tránh Tác vụ Hệ thống Tệp từ việc gửi thông báo lỗi vào lúc thiết kế, hãy gán nó với một số giá trị giả F:\Temp\1.txt.

  • FilePattern xác định mẫu tệp sẽ được lặp qua trong đường dẫn thư mục nguồn đã cho. Hãy gán *.*, có nghĩa là tất cả các tệp sẽ được lặp qua. Bạn cũng có thể chỉ định *.txt hoặc File*.txt hoặc My*.xls v.v. Đó là tối đa các yêu cầu của bạn.

  • MonthStartPosition biểu thị vị trí nơi giá trị tháng bắt đầu trong tên tệp. Vì vậy, ở định dạng tên tệp File 29-07-2011, tháng 07 bắt đầu ở ký tự thứ 9. Do đó giá trị 9.

  • MonthLength chỉ định số ký tự cần trích xuất.Điều này sẽ anyways được 2 ký tự nhưng tôi không muốn mã cứng. Vì vậy, tôi đã tạo một biến.

  • MonthNameFormat chỉ định cách tạo thư mục. Giá trị MMMM biểu thị rằng nó sẽ tạo ra các thư mục có tên tháng đầy đủ như tháng 1, tháng 2 vv. Nếu chúng ta sử dụng giá trị MMM, các thư mục sẽ được tạo thành Jan, Feb etc. Các thư mục sẽ chỉ được tạo nếu chúng không tồn tại.

Variables

On Flow Control tab gói của SSIS, đặt một Foreach loop container và cấu hình nó để lặp qua các thư mục quy định trong biến SourceFolder sử dụng mô hình tập tin biến FilePattern. Khi vòng lặp Foreach lặp qua các tệp, tên tệp sẽ được gán cho biến SourceFilePath. Chúng ta sẽ sử dụng biến này để tìm nạp giá trị tháng trong Script Task.

Foreach loop container General

Foreach loop container Collection

Foreach loop container Variable Mappings

Trong thùng chứa vòng lặp foreach, đặt một nút ... Script Task và trên phần Script nhiệm vụ kịch bản của kích kịch bản thiết kế để mở trình soạn thảo VSTA và dán mã được cung cấp sau các ảnh chụp màn hình này. Kể từ khi ví dụ được tạo trong VS 2005, mã được viết bằng VB.NET vì đó là ngôn ngữ được hỗ trợ duy nhất trong SSIS 2005.

Script Task General

Script Task Script

Script Task Code

Script công tác Mã số: Các mã được tập tin giá trị đường dẫn đầy đủ từ biến SourceFilePath và chiết xuất chỉ có tên tập tin để lưu trữ nó trong biến cục bộ FileName.

Sau đó kiểm tra xem các biến số MonthStartPositionMonthLength có được gán với các giá trị khác không. Sau đó nó trích xuất giá trị tháng để lưu trữ nó trong biến cục bộ MonthValue.

Sử dụng MonthValue, nó lấy giá trị tên đầy đủ tháng bằng hàm DateTime. Các giá trị 1 được gán cho ngày và năm bởi vì chúng tôi chỉ muốn tên Tháng.

Tên tháng trong biến cục bộ Tên thư mục được kết hợp với giá trị DestinationRoot để kiểm tra xem thư mục có tồn tại hay không. Nếu thư mục không tồn tại, thư mục sẽ được tạo để Tác vụ Hệ thống Tệp không thành công.

Cuối cùng, giá trị thư mục đích đầy đủ được gán cho biến gói DestinationFolder. Biến này sẽ được sử dụng trong Tác vụ Hệ thống Tệp.

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

Trong thùng chứa vòng lặp foreach, đặt File System tác sau khi nhiệm vụ Script. Cấu hình nhiệm vụ hệ thống tệp như được hiển thị trong ảnh chụp màn hình.

File System Task

Khi nhiệm vụ gói được cấu hình, tab Flow Control sẽ giống như như hình dưới đây.

Control Flow

Hãy kiểm tra gói. Trước đó, nội dung của thư mục nguồn F: \ Temp được hiển thị bên dưới. Các tập tin là giả. Do đó, kích thước 0 KB.

F Temp Folder

Ảnh chụp màn hình bên dưới cho thấy việc thực hiện thành công gói.

Success

Dưới ảnh chụp màn hình hiển thị như thế nào các tập tin đã được chuyển đến thư mục đích tương ứng đã được tạo ra dựa trên các tên tháng. Nội dung của các thư mục cá nhân được hiển thị bên dưới.

Hy vọng điều đó sẽ hữu ích.

F Temp

F Temp Monthwise

F Temp Monthwise August

F Temp Monthwise January

F Temp Monthwise July

Các vấn đề liên quan