Bonjour à tous !


je voudrais vous soumettre ce petit code, c'est la première fois que je fais qqch en DOT NET et j'ai absolument besoin que ça soit fiable.

Je suis en particulier assez perturbé par le using sw as streamwriter et le sw.close()
J'ai l'impression que le streamwriter n'écrit dans le fichier qu'au close et ça m'ennuie un peu.

Merci de votre aide


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
Imports System
Imports System.Data
Imports System.Math
Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO
 
 
Public Class ScriptMain
 
 
    Public Sub Main()
 
        Try
 
            Dim InputFile As String
            Dim OutputFile As String
            Dim rundate As String
            Dim writeFirstFields As Boolean
            Dim writeFields As Boolean
            Dim writeData As Boolean
            Dim sr As StreamReader
            Dim line As String
 
            'gestion d'erreurs
            Dim rowsProcessed As Integer
            Dim emptyBytes(0) As Byte
 
 
 
            'Gestion des fichiers
            If Dts.Variables.Contains("InputFile") And Dts.Variables.Contains("OutputFile") Then
                InputFile = Dts.Variables("InputFile").ToString
                OutputFile = Dts.Variables("OutputFile").ToString
            Else
                Dts.TaskResult = Dts.Results.Failure
                Throw New Exception("(" & DateTime.Now & ") " & "DTS Variables ""InputFile"" and ""OutputFile"" are not defined")
            End If
 
 
            If Not File.Exists(InputFile) Then Throw New Exception("(" & DateTime.Now & ") " & "The Input File doesn't exist")
            If File.Exists(OutputFile) Then File.Delete(OutputFile)
 
 
 
 
 
            'lecture / écriture vers le nouveau fichier
            sr = New StreamReader(InputFile)
            Using sw As streamwriter = New StreamWriter(OutputFile)
 
                writeFirstFields = False
                writeFields = False
                writeData = False
 
                rowsProcessed = 0
 
                Do
                    line = sr.ReadLine()
                    rowsProcessed += 1
 
                    If line.Contains("START-OF-FIELDS") Then
                        Dts.Log("(" & DateTime.Now & ") " & "START-OF-FIELDS at row: " & rowsProcessed.ToString, 0, emptyBytes)
                        writeFields = True
                        writeFirstFields = True
                        line = sr.ReadLine()
                    ElseIf line.Contains("END-OF-FIELDS") Then
                        Dts.Log("(" & DateTime.Now & ") " & "END-OF-FIELDS at row: " & rowsProcessed.ToString, 0, emptyBytes)
                        writeFields = False
                    ElseIf line.Contains("START-OF-DATA") Then
                        Dts.Log("(" & DateTime.Now & ") " & "START-OF-DATA at row: " & rowsProcessed.ToString, 0, emptyBytes)
                        sw.Write(vbCrLf) 'on était au bout de la 1ère ligne (Fields) dans le OutputFile
                        writeData = True
                        line = sr.ReadLine()
                    ElseIf line.Contains("END-OF-DATA") Then
                        Dts.Log("(" & DateTime.Now & ") " & "END-OF-DATA at row: " & rowsProcessed.ToString, 0, emptyBytes)
                        writeData = False
                    ElseIf line.Contains("RUNDATE=") Then
                        'RUNDATE=20080715
                        rundate = Right(line, 8)
                    End If
 
 
                    'les 3 premiers champs n'apparaissent pas dans la liste des champs, on ajoute RunDate en plus
                    If writeFirstFields Then
                        sw.Write("Rundate|Ticker|Return Code|nbFields|")
                        writeFirstFields = False
                    End If
 
 
                    If writeFields Then sw.Write(line & "|")
                    If writeData Then sw.WriteLine(rundate & "|" & line)
 
                Loop Until line.Contains("END-OF-DATA")
 
 
                sr.Close()
                sw.Close()
 
                Dts.TaskResult = Dts.Results.Success
 
            End Using
 
        Catch ex As Exception
            Dts.Log("(" & DateTime.Now & ") " & "Importation Script from Bloomberg Data Licence", ex.Message & ControlChars.CrLf & ex.StackTrace)
            Dts.Events.FireError(0, "Importation Script from Bloomberg Data Licence", ex.Message & ControlChars.CrLf & ex.StackTrace, String.Empty, 0)
            Dts.TaskResult = Dts.Results.Failure
        Finally
            Dts.Log("(" & DateTime.Now & ") " & "End at row: " & rowsProcessed.ToString)
            sr.close()
            sw.close()
        End Try
 
    End Sub
 
End Class