script VB adapted to SSIS 2k5

  • I wrote a script component with the help of a specialist

    Here its procedure to read a file sequentially (It's good in VB)

    '---

    Option Explicit

    '---

    Const vGlo_Read = 1

    Const vGlo_Writ = 2

    '---

    Dim vLoc_Cpte

    Dim vLoc_Ecri

    Dim vLoc_Lign

    Dim vLoc_LigP

    Dim vLoc_OFSO

    Dim vLoc_Posi

    Dim vLoc_ReaF

    Dim vLoc_ReaO

    Dim vLoc_Text

    Dim vLoc_WriF

    Dim vLoc_WriO

    '---

    Set vLoc_OFSO = CreateObject("Scripting.FileSystemObject")

    '---

    vLoc_ReaF = "C:\Users\Thierry\TRI\cls0_brokerlog.log"

    vLoc_WriF = "C:\Users\Thierry\TRI\Ctre_Rendu_cls0_brokerlog.txt"

    '---

    Set vLoc_WriO = vLoc_OFSO.OpenTextFile(vLoc_WriF, vGlo_Writ, True)

    '---

    If vLoc_OFSO.FileExists(vLoc_ReaF) = True Then

    Set vLoc_ReaO = vLoc_OFSO.OpenTextFile(vLoc_ReaF, vGlo_Read)

    While vLoc_ReaO.AtEndOfStream <> True

    vLoc_Lign = vLoc_ReaO.ReadLine

    vLoc_Cpte = VLoc_Cpte + 1

    vLoc_LigP = 0

    vLoc_Posi = InStr(1, vLoc_Lign, "computer")

    If vLoc_Posi > 0 then

    vLoc_Text = Rech(vLoc_Lign, vLoc_Cpte, vLoc_LigP, vLoc_Posi, "computer")

    vLoc_WriO.WriteLine(vLoc_Text)

    vLoc_LigP = vLoc_LigP + 1

    End If

    vLoc_Posi = InStr(1, vLoc_Lign, "datasource")

    If vLoc_Posi > 0 then

    vLoc_Text = Rech(vLoc_Lign, vLoc_Cpte, vLoc_LigP, vLoc_Posi, "datasource")

    vLoc_WriO.WriteLine(vLoc_Text)

    vLoc_LigP = vLoc_LigP + 1

    End If

    vLoc_Posi = InStr(1, vLoc_Lign, "server")

    vLoc_Ecri = False

    If vLoc_Posi > 0 then

    vLoc_Text = Rech(vLoc_Lign, vLoc_Cpte, vLoc_LigP, vLoc_Posi, "server")

    If Veri(vLoc_Text, "has") = "Oui" Then vLoc_Ecri = True

    If Veri(vLoc_Text, "on") = "Oui" Then vLoc_Ecri = True

    If Veri(vLoc_Text, "returned") = "Oui" Then vLoc_Ecri = True

    If Veri(vLoc_Text, "started") = "Oui" Then vLoc_Ecri = True

    If Veri(vLoc_Text, "to") = "Oui" Then vLoc_Ecri = True

    If vLoc_Ecri = False Then vLoc_WriO.WriteLine(vLoc_Text)

    End If

    Wend

    vLoc_ReaO.Close

    End If

    '---

    vLoc_WriO.Close

    '---

    Set vLoc_Cpte = Nothing

    Set vLoc_Ecri = Nothing

    Set vLoc_Lign = Nothing

    Set vLoc_LigP = Nothing

    Set vLoc_OFSO = Nothing

    Set vLoc_Posi = Nothing

    Set vLoc_ReaF = Nothing

    Set vLoc_ReaO = Nothing

    Set vLoc_Text = Nothing

    Set vLoc_WriF = Nothing

    Set vLoc_WriO = Nothing

    '---

    Function Rech(ByRef vLoc_Lign, ByRef vLoc_Cpte, ByRef vLoc_LigP, ByRef vLoc_Posi, ByRef vLoc_Mot)

    Dim vLoc_Cpt1

    Dim vLoc_Date

    Dim vLoc_Pos1

    Dim vLoc_Tex1

    '---

    vLoc_Cpt1 = Right("00000000" & vLoc_Cpte, 8) & " = "

    vLoc_Date = Left(vLoc_Lign, 17) & " = "

    vLoc_Tex1 = Mid(vLoc_Lign, vLoc_Posi + Len(vLoc_Mot) + 1)

    If Right(vLoc_Tex1, 1) = "." Then

    vLoc_Tex1 = Left(vLoc_Tex1, Len(vLoc_Tex1) - 1)

    End If

    vLoc_Pos1 = InStr(1, vLoc_Tex1, " ")

    If vLoc_Pos1 > 0 then

    vLoc_Tex1 = Left(vLoc_Tex1, vLoc_Pos1 - 1)

    End If

    vLoc_Pos1 = InStr(1, vLoc_Tex1, """")

    If vLoc_Pos1 = 1 then

    vLoc_Tex1 = Right(vLoc_Tex1, Len(vLoc_Tex1) - 1)

    End If

    vLoc_Pos1 = InStr(1, vLoc_Tex1, """")

    If vLoc_Pos1 > 0 then

    vLoc_Tex1 = Left(vLoc_Tex1, vLoc_Pos1 - 1)

    End If

    vLoc_Pos1 = InStr(1, vLoc_Tex1, "&")

    If vLoc_Pos1 > 0 then

    vLoc_Tex1 = Left(vLoc_Tex1, vLoc_Pos1 - 1)

    End If

    vLoc_Mot = Left(vLoc_Mot & Space(10), 10)

    If vLoc_LigP > 0 Then

    Rech = Space(Len(vLoc_Cpt1 & vLoc_Date)) & vLoc_Mot & " = " & vLoc_Tex1

    Else

    Rech = vLoc_Cpt1 & vLoc_Date & vLoc_Mot & " = " & vLoc_Tex1

    End If

    '---

    Set vLoc_Cpt1 = Nothing

    Set vLoc_Date = Nothing

    Set vLoc_Pos1 = Nothing

    Set vLoc_Tex1 = Nothing

    End Function

    '---

    Function Veri(ByRef vLoc_Text, ByRef vLoc_Mot)

    If Right(vLoc_Text, Len(vLoc_Mot)) = vLoc_Mot Then

    Veri = "Oui"

    Else

    Veri = "Non"

    End If

    End Function

    Here is my adaptation for SSIS (it's bad )

    '-----------------------------------------------------------------------------

    ‘ VERSION ADAPTEE SSIS

    '-----------------------------------------------------------------------------

    ' Microsoft SQL Server Integration Services user script component

    ' This is your new script component in Microsoft Visual Basic .NET

    ' ScriptMain is the entrypoint class for script components

    Imports System

    Imports System.Data

    Imports System.Math

    Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

    Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

    Public Class ScriptMain

    Inherits UserComponent

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    '

    ' Add your code hereCouleur commentaires (111, 150, 0)

    '

    '-----------------------------------------------------------------------------

    ' Traitement de recherche du mot-clé computer pour trouver le nom d’un serveur

    '-----------------------------------------------------------------------------

    Dim vLoc_Lign As String 'vLoc_Lign = récupération de la ligne en cours

    Dim vLoc_LigP As Integer 'vLoc_LigP = compteur de positionnement dans la ligne

    Dim vLoc_Posi As Integer 'vLoc_Posi = index de position dans la ligne

    Dim vLoc_Text As String 'vLoc_Text = récupération de l’occurrence transformée

    Dim vLoc_Mot As String 'vLoc_Mot = mot-clé pour recherche valeur

    '-----------------------------------------------------------------------------

    'Positionnement sur le champ contenant « computer »

    'Appel de la fonction Rech pour récupérer la valeur associée

    '-----------------------------------------------------------------------------

    vLoc_Lign = Row.LServeur

    'vLoc_Text = "SGSI2KSIFAPP12"

    vLoc_Posi = InStr(1, vLoc_Lign, "computer")

    If vLoc_Posi > 0 Then

    vLoc_Text = CStr(Rech(vLoc_Lign, vLoc_LigP, vLoc_Posi, "computer"))

    Row.BServeur = vLoc_Text

    vLoc_LigP = vLoc_LigP + 1

    End If

    ' While vLoc_Lign.AtEndOfLine <> True

    ' While vLoc_Lign.AtEndOfLine <> True

    ' If vLoc_Posi > 0 Then

    ' vLoc_Text = CStr(Rech(vLoc_Lign, vLoc_LigP, vLoc_Posi, "computer"))

    ' Row.BServeur = vLoc_Text

    ' vLoc_LigP = vLoc_LigP + 1

    ' End If

    ' End While

    vLoc_Lign = Nothing

    vLoc_LigP = Nothing

    vLoc_Posi = Nothing

    vLoc_Text = Nothing

    End Sub

    '-----------------------------------------------------------------------------

    'Fonction Rech : elle permet la recherche d’une chaîne de caractères

    ' mais aussi l’élimination des caractères superflus

    ' comme les cottes, les guillemets et autres joyeusetés

    '-----------------------------------------------------------------------------

    Function Rech(ByRef vLoc_Lign As String, ByRef vLoc_LigP As Integer, ByRef vLoc_Posi As Integer, ByRef vLoc_Mot As String) As String

    Dim vLoc_Date As String 'vLoc_Date = récup Date+ Heure (17 prem.caract)

    Dim vLoc_Pos1 As Integer 'vLoc_Lign = récup index du mot-clé

    Dim vLoc_Tex1 As String 'vLoc_Lign = valeur à récupérer

    '-----------------------------------------------------------------------------

    ' La fonction Right( ) donne les N caractères les plus à droite dans une chaine

    'Right(chaine, N) exp: Right ("abcdefg", 3)donne «efg"

    '

    ' La fonction Left( ) donne les N caractères les plus à gauche dans une chaine

    'Left(chaine, N) exp: Left ("abcdefg", 3)donne «abc"

    '-----------------------------------------------------------------------------

    vLoc_Date = Left(CStr(vLoc_Lign), 17) & " = "

    '-----------------------------------------------------------------------------

    ' La fonction Len(string | varname)

    'Renvoie le nombre de caractères d'une chaîne de caractères Len(string)

    'ou le nombre d'octets nécessaires pour stocker une variable Len(varname)

    '-----------------------------------------------------------------------------

    'vLoc_Tex1 = Mid(vLoc_Lign, CInt((CStr(vLoc_Posi + Len(vLoc_Mot) + 1))))

    vLoc_Tex1 = Mid(vLoc_Lign, CInt(vLoc_Posi + Len(vLoc_Mot) + 1))

    If Right(vLoc_Tex1, 1) = "." Then

    vLoc_Tex1 = Left(vLoc_Tex1, Len(vLoc_Tex1) - 1)

    End If

    '-----------------------------------------------------------------------------

    ' Position par rapport aux points

    '-----------------------------------------------------------------------------

    vLoc_Pos1 = InStr(1, vLoc_Tex1, " ")

    If vLoc_Pos1 > 0 Then

    vLoc_Tex1 = Left(vLoc_Tex1, vLoc_Pos1 - 1)

    End If

    '-----------------------------------------------------------------------------

    ' Position par rapport aux guillemets éventuels à droite et à gauche

    '-----------------------------------------------------------------------------

    vLoc_Pos1 = InStr(1, vLoc_Tex1, """")

    If vLoc_Pos1 = 1 Then

    vLoc_Tex1 = Right(vLoc_Tex1, Len(vLoc_Tex1) - 1)

    End If

    vLoc_Pos1 = InStr(1, vLoc_Tex1, """")

    If vLoc_Pos1 > 0 Then

    vLoc_Tex1 = Left(vLoc_Tex1, vLoc_Pos1 - 1)

    End If

    '-----------------------------------------------------------------------------

    ' Position par rapport à une esperluette à gauche«&computer», «&datasource»

    '-----------------------------------------------------------------------------

    vLoc_Pos1 = InStr(1, vLoc_Tex1, "&")

    If vLoc_Pos1 > 0 Then

    vLoc_Tex1 = Left(vLoc_Tex1, vLoc_Pos1 - 1)

    End If

    '-----------------------------------------------------------------------------

    ' Résultat à renvoyer : Date+Heure = mot-clé = valeur

    '-----------------------------------------------------------------------------

    vLoc_Mot = Left(vLoc_Mot & Space(10), 10)

    If vLoc_LigP > 0 Then

    Rech = Len(vLoc_Date) & vLoc_Mot & " = " & vLoc_Tex1

    Else

    Rech = vLoc_Date & vLoc_Mot & " = " & vLoc_Tex1

    End If

    vLoc_Date = Nothing

    vLoc_Pos1 = Nothing

    vLoc_Tex1 = Nothing

    End Function

    End Class

    And the messages of errors

      at Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer.SetString(Int32 columnIndex, String value)

      at Microsoft.SqlServer.Dts.Pipeline.PipelineBuffer.set_Item(Int32 columnIndex, Object value)

      at Microsoft.SqlServer.Dts.Pipeline.ScriptBuffer.set_Item(Int32 ColumnIndex, Object value)

      at ScriptComponent_7c05211e879443cb9cdcbe227f0999c6.Input0Buffer.set_BServeur(String Value)

      at ScriptComponent_7c05211e879443cb9cdcbe227f0999c6.ScriptMain.Input0_ProcessInputRow(Input0Buffer Row)

      at ScriptComponent_7c05211e879443cb9cdcbe227f0999c6.UserComponent.Input0_ProcessInput(Input0Buffer Buffer)

      at ScriptComponent_7c05211e879443cb9cdcbe227f0999c6.UserComponent.ProcessInput(Int32 InputID, PipelineBuffer Buffer)

      at Microsoft.SqlServer.Dts.Pipeline.ScriptComponentHost.ProcessInput(Int32 inputID, PipelineBuffer buffer)

    I know I did not use the loop with while because "AtEndOfStream" and "AtEndOfLine" are not accepted by SSIS

    My entry is

    INPUT LServeur ReadOnly

    My exit is

    OUTPUT BServeur Unicode string [DT_WSTR] Length 15

    Please, can you help me ?

    :hehe:

  • EUREKA script component

    Hello,

    I found the solution this morning, this solution could be used again

    ' Microsoft SQL Server Integration Services user script component

    ' This IS your new script component IN Microsoft Visual Basic .NET

    ' ScriptMain is the entrypoint class for script components

    Imports System

    Imports System.Data

    Imports System.Math

    Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

    Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

    Public Class ScriptMain

    Inherits UserComponent

    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)

    '

    ' Add your code hereCouleur commentaires (111, 150, 0)

    '

    '-----------------------------------------------------------------------------

    ' Traitement de recherche du mot-clé computer pour trouver le nom d’un serveur

    '-----------------------------------------------------------------------------

    Dim vLoc_Lign As String 'vLoc_Lign = récupération de la ligne en cours

    Dim vLoc_LigP AS Integer 'vLoc_LigP = compteur de positionnement dans la ligne

    Dim vLoc_Posi As Integer 'vLoc_Posi = INDEX de position dans la ligne

    Dim vLoc_Text AS String 'vLoc_Text = récupération de l’occurrence transformée

    Dim vLoc_Mot As String 'vLoc_Mot = mot-clé pour recherche valeur

    '-----------------------------------------------------------------------------

    'Positionnement sur le champ contenant « computer »

    'Appel de la fonction Rech pour récupérer la valeur associée

    '-----------------------------------------------------------------------------

    vLoc_Lign = Row.LServeur

    'vLoc_Text = "SGSI2KSIFAPP12"

    'Row.BServeur = vLoc_Text

    Row.BServeur = " "

    While vLoc_LigP < 251

    vLoc_Posi = InStr(1, vLoc_Lign, "computer")

    IF vLoc_Posi > 0 Then

    ' vLoc_Text = CStr(Rech(vLoc_Lign, vLoc_LigP, vLoc_Posi, "computer"))

    vLoc_Text = Rech(vLoc_Lign, vLoc_LigP, vLoc_Posi, "computer")

    If Mid(vLoc_Text, 1, 8) = "computer" Then

    vLoc_LigP = 251

    End If

    Row.BServeur = Mid(vLoc_Text, 11)

    vLoc_LigP = vLoc_LigP + 1

    End If

    End While

    vLoc_Lign = Nothing

    vLoc_LigP = Nothing

    vLoc_Posi = Nothing

    vLoc_Text = Nothing

    End Sub

    '-----------------------------------------------------------------------------

    'Fonction Rech : elle permet la recherche d’une chaîne de caractères

    ' mais aussi l’élimination des caractères superflus

    ' comme les cottes, les guillemets et autres joyeusetés

    '-----------------------------------------------------------------------------

    FUNCTION Rech(ByRef vLoc_Lign AS String, ByRef vLoc_LigP AS Integer, ByRef vLoc_Posi AS Integer, ByRef vLoc_Mot AS String) AS String

    Dim vLoc_Date AS String 'vLoc_Date = récup Date+ Heure (17 prem.caract)

    Dim vLoc_Pos1 As Integer 'vLoc_Lign = récup INDEX du mot-clé

    Dim vLoc_Tex1 AS String 'vLoc_Lign = valeur à récupérer

    '-----------------------------------------------------------------------------

    ' La fonction Right( ) donne les N caractères les plus à droite dans une chaine

    'RIGHT(chaine, N) exp: RIGHT ("abcdefg", 3)donne «efg"

    '

    ' La fonction Left( ) donne les N caractères les plus à gauche dans une chaine

    'Left(chaine, N) exp: Left ("abcdefg", 3)donne «abc"

    '-----------------------------------------------------------------------------

    'vLoc_Date = LEFT(CStr(vLoc_Lign), 17) & " = "

    vLoc_Date = LEFT(vLoc_Lign, 17) & " = "

    '-----------------------------------------------------------------------------

    ' La fonction Len(string | varname)

    'Renvoie le nombre de caractères d'une chaîne de caractères Len(string)

    'ou le nombre d'octets nécessaires pour stocker une variable Len(varname)

    '-----------------------------------------------------------------------------

    'vLoc_Tex1 = Mid(vLoc_Lign, CInt((CStr(vLoc_Posi + Len(vLoc_Mot) + 1))))

    'vLoc_Tex1 = Mid(vLoc_Lign, CInt(vLoc_Posi + Len(vLoc_Mot) + 1))

    vLoc_Tex1 = Mid(vLoc_Lign, vLoc_Posi + Len(vLoc_Mot) + 1)

    If Right(vLoc_Tex1, 1) = "." Then

    vLoc_Tex1 = Left(vLoc_Tex1, Len(vLoc_Tex1) - 1)

    End If

    '-----------------------------------------------------------------------------

    ' Position par rapport aux points

    '-----------------------------------------------------------------------------

    vLoc_Pos1 = InStr(1, vLoc_Tex1, " ")

    IF vLoc_Pos1 > 0 Then

    vLoc_Tex1 = LEFT(vLoc_Tex1, vLoc_Pos1 - 1)

    End IF

    '-----------------------------------------------------------------------------

    ' Position par rapport aux guillemets éventuels à droite et à gauche

    '-----------------------------------------------------------------------------

    vLoc_Pos1 = InStr(1, vLoc_Tex1, """")

    If vLoc_Pos1 = 1 Then

    vLoc_Tex1 = Right(vLoc_Tex1, Len(vLoc_Tex1) - 1)

    End If

    vLoc_Pos1 = InStr(1, vLoc_Tex1, """")

    If vLoc_Pos1 > 0 Then

    vLoc_Tex1 = Left(vLoc_Tex1, vLoc_Pos1 - 1)

    End If

    '-----------------------------------------------------------------------------

    ' Position par rapport à une esperluette à gauche«&computer», «&datasource»

    '-----------------------------------------------------------------------------

    vLoc_Pos1 = InStr(1, vLoc_Tex1, "&")

    IF vLoc_Pos1 > 0 Then

    vLoc_Tex1 = LEFT(vLoc_Tex1, vLoc_Pos1 - 1)

    End IF

    '-----------------------------------------------------------------------------

    ' Résultat à renvoyer : "computer = " valeur

    '-----------------------------------------------------------------------------

    'vLoc_Mot = LEFT(vLoc_Mot & Space(10), 10)

    'If vLoc_LigP > 0 Then

    ' Rech = Len(vLoc_Date) & vLoc_Mot & " = " & vLoc_Tex1

    'Else

    ' Rech = vLoc_Date & vLoc_Mot & " = " & vLoc_Tex1

    'End If

    Rech = vLoc_Mot & " = " & vLoc_Tex1

    vLoc_Date = Nothing

    vLoc_Pos1 = Nothing

    vLoc_Tex1 = Nothing

    End Function

    End Class

    Comments:

    1 _It was necessary to remake the loop with a numerical counter, if ever it will be too large, I can always decrease it ( 250, 249 …)

    2 _the casts had been imposed to me by the compiler before I declare with "As", as a result there was a conflict

    No more cast was needed by declarations like "As Integer, As String..."

    3 _It remains to arrange the end of the function to recover my values

    I am relieved:-P

Viewing 2 posts - 1 through 1 (of 1 total)

You must be logged in to reply to this topic. Login to reply