2015-05-14 3 views
0

У меня есть следующая сценария: У меня есть тысячи текстовых файлов с указанным ниже форматом. Названия столбцов написаны в отдельных строках, где, поскольку значения строк ограничены Pipe (|), ,Как фильтровать Flat File Source с помощью компонента сценария

START-OF-FILE 
PROGRAMNAME=getdata 
DATEFORMAT=yyyymmdd 

#Some Text 
#Some Text 
#Some Text 
#Some Text 
#Some Text 
START-OF-FIELDS 
Field1 
Field2 
Field3 
------ 
FieldN 
END-OF-FIELDS 
TIMESTARTED=Tue May 12 16:04:42 JST 2015 
START-OF-DATA 
Field1Value|Field2value|Field3Value|...|Field N Value 
Field1Value|Field2value|Field3Value|...|Field N Value 
------|...........|----|------- 
END-OF-DATA 
DATARECORDS=30747 
TIMEFINISHED=Tue May 12 16:11:53 JST 2015 
END-OF-FILE 

Теперь у меня есть соответствующая таблица SQL Server, где я могу легко загрузить данные в качестве адресата. Поскольку я новичок в SSIS, у меня возникли проблемы с написанием компонента Script, чтобы я мог фильтровать исходные текстовые файлы и легко загружать их в таблицу sql-сервера.

Заранее благодарен!

ответ

0

Существует несколько способов сделать это. Если формат файлов является постоянным, есть некоторые полезные свойства редактора менеджера соединений с плоскими файлами. Например, вы можете добавить новое соединение с плоским файлом в менеджерах соединений. Для вышеуказанного файла есть некоторые свойства, такие как «Строки для пропусков», вы можете установить это на 18. Затем он будет начинаться с строки столбцов с помощью «|».

Другое свойство диспетчера соединений с плоскими файлами, которое может быть полезно, заключается в том, что если вы открываете диспетчер соединений с плоскими файлами, а затем щелкните по столбцам в боковом меню, вы можете установить разделитель столбцов на трубку «|»

Но если формат файла изменится, например. переменное количество строк заголовка, вы можете использовать задачу сценария для удаления любых строк, не связанных между собой. например верхний и нижний колонтитулы.

Например, вы можете добавить метод, например file.readalllines, а затем отредактировать или удалить строки по мере необходимости, а затем сохранить файл.

Информация об этом методе здесь: https://msdn.microsoft.com/en-us/library/s2tte0y1%28v=vs.110%29.aspx

например удалить последнюю строку в задаче сценария

string[] lines = File.ReadAllLines("input.txt"); 
StringBuilder sb = new StringBuilder(); 
int count = lines.Length - 1; // all except last line 
for (int i = 0; i < count; i++) 
{ 
    sb.AppendLine(lines[i]); 
} 
File.WriteAllText("output.txt", sb.ToString()); 
0

ПОЛЬЗОВАНИЯ Ниже VB Script в вашем SSIS скриптом компонентов Задача в качестве источника

enter code here 

Imports System 
Imports System.Data 
Imports System.Math 
Imports System.IO 
Imports Microsoft.SqlServer.Dts.Runtime 
Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper 
Imports Microsoft.SqlServer.Dts.Runtime.Wrapper 



<Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute()> _ 
<CLSCompliant(False)> _ 
Public Class ScriptMain 
    Inherits UserComponent 
    'Private strSourceDirectory As String 
    'Private strSourceFileName As String 
    Private strSourceSystem As String 
    Private strSourceSubSystem As String 
    Private dtBusinessDate As Date 


    Public Overrides Sub PreExecute() 
     MyBase.PreExecute() 
     ' 
     ' Add your code here for preprocessing or remove if not needed 
     '' 

    End Sub 

    Public Overrides Sub PostExecute() 
     MyBase.PostExecute() 
     ' 
     ' Add your code here for postprocessing or remove if not needed 
     ' You can set read/write variables here, for example: 
     Dim strSourceDirectory As String = Me.Variables.GLOBALSourceDirectory.ToString() 
     Dim strSourceFileName As String = Me.Variables.GLOBALSourceFileName.ToString() 
     'Dim strSourceSystem As String = Me.Variables.GLOBALSourceSystem.ToString() 
     'Dim strSourceSubSystem As String = Me.Variables.GLOBALSourceSubSystem.ToString() 
     'Dim dtBusinessDate As Date = Me.Variables.GLOBALBusinessDate.Date 


    End Sub 

    Public Overrides Sub CreateNewOutputRows() 
     ' 
     ' Add rows by calling the AddRow method on the member variable named "<Output Name>Buffer". 
     ' For example, call MyOutputBuffer.AddRow() if your output was named "MyOutput". 
     ' 
     Dim sr As System.IO.StreamReader 
     Dim strSourceDirectory As String = Me.Variables.GLOBALSourceDirectory.ToString() 
     Dim strSourceFileName As String = Me.Variables.GLOBALSourceFileName.ToString() 
     'Dim strSourceSystem As String = Me.Variables.GLOBALSourceSystem.ToString() 
     'Dim strSourceSubSystem As String = Me.Variables.GLOBALSourceSubSystem.ToString() 
     'Dim dtBusinessDate As Date = Me.Variables.GLOBALBusinessDate.Date 

     'sr = New System.IO.StreamReader("C:\QRM_SourceFiles\BBG_BONDS_OUTPUT_YYYYMMDD.txt") 
     sr = New System.IO.StreamReader(strSourceDirectory & strSourceFileName) 
     Dim lineIndex As Integer = 0 
     While (Not sr.EndOfStream) 
      Dim line As String = sr.ReadLine() 
      If (lineIndex <> 0) Then 'remove header row 
       Dim columnArray As String() = line.Split(Convert.ToChar("|")) 
       If (columnArray.Length > 1) Then 
        Output0Buffer.AddRow() 
        Output0Buffer.Col0 = columnArray(0).ToString() 
        Output0Buffer.Col3 = columnArray(3).ToString() 
        Output0Buffer.Col4 = columnArray(4).ToString() 
        Output0Buffer.Col5 = columnArray(5).ToString() 
        Output0Buffer.Col6 = columnArray(6).ToString() 
        Output0Buffer.Col7 = columnArray(7).ToString() 
        Output0Buffer.Col8 = columnArray(8).ToString() 
        Output0Buffer.Col9 = columnArray(9).ToString() 
        Output0Buffer.Col10 = columnArray(10).ToString() 
        Output0Buffer.Col11 = columnArray(11).ToString() 
        Output0Buffer.Col12 = columnArray(12).ToString() 
        Output0Buffer.Col13 = columnArray(13).ToString() 
        Output0Buffer.Col14 = columnArray(14).ToString() 
        Output0Buffer.Col15 = columnArray(15).ToString() 
        Output0Buffer.Col16 = columnArray(16).ToString() 
        Output0Buffer.Col17 = columnArray(17).ToString() 
        Output0Buffer.Col18 = columnArray(18).ToString() 
        Output0Buffer.Col19 = columnArray(19).ToString() 
        Output0Buffer.Col20 = columnArray(20).ToString() 
        Output0Buffer.Col21 = columnArray(21).ToString() 
        Output0Buffer.Col22 = columnArray(22).ToString() 
        Output0Buffer.Col23 = columnArray(23).ToString() 
        Output0Buffer.Col24 = columnArray(24).ToString() 

       End If 
      End If 
      lineIndex = lineIndex + 1 
     End While 
     sr.Close() 

    End Sub 

End Class 

Код Конец

Смежные вопросы