January 19, 2010 at 8:35 am
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.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:
January 20, 2010 at 6:43 am
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