[VB.NET 1.1][se repositionner dans un flux : BaseStream.Position BaseStream.Seek

ginkyo Messages postés 2 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 21 août 2006 - 18 août 2006 à 19:16
ginkyo Messages postés 2 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 21 août 2006 - 21 août 2006 à 10:14
Bonjour,
Je viens vers vous pour vous soumettre une chtite question :
J'ai besoin de récupérer la position (il n'existe pas de méthode pour récuperer juste le numéro de ligne) dans un flux, afin de la mettre à zéro pour lancer une recherche puis de retourner à la position initiale (avant la remise à zéro).

Dans la vrai vie j'ai un besoin d'intégrer dans un code vb un truc que l'on awk ou perl en deux temps trois mouvement : trouver les lignes qui ont 16 premiers octets identiques, si oui supprimer les lignes en doublons, en prenant soin de récupérer un champ (chiffres entre les caractères # et ; ) pour les additionner à la premier ligne et ainsi de suite.

Mon code :

Public Sub CompulserDoublon(ByVal strNom_Fichier As String)
Dim oFichier As System.IO.File
Dim sLigne As String
Dim arrLigne As Array
Dim iTailleLigne, iTailleLigne2, lLigneO, lLigneO2 As Long
Dim oFlux As New System.IO.FileStream(strNom_Fichier, IO.FileMode.Open, IO.FileAccess.ReadWrite, IO.FileShare.ReadWrite)
Dim oFluxLec As New System.IO.StreamReader(oFlux) ', True,System.Text.Encoding.ASCII )
Dim oFluxEcr As New System.IO.StreamWriter(oFlux)

Dim Regexp As Regex

Dim dQte, dQte2 As Double
Dim sPlop, sRecherche, sRecherche2, sRegx, sL As String
Dim sCompteur, sCompteur2 As Integer
Dim memStream As New MemoryStream(100)

Try
sCompteur = 0
lLigneO = 0

Do While oFluxLec.Peek <> -1

'Console.WriteLine(oFluxLec.BaseStream.Position())
'sCompteur += 1
sPlop = oFluxLec.ReadToEnd()
sRecherche = sPlop.Substring(0, 16)
sRegx = Regex.Match(sPlop, "(?<=#).[^;]*(?=;)").Value()
'dQte = System.Convert.ToDouble(sRegx)

'lLigneO = oFluxLec.BaseStream.Position()
lLigneO = oFluxLec.BaseStream.Seek(0, IO.SeekOrigin.Current)
'lLigneO = IO.SeekOrigin.Current

'oFlux.Position() = 0
oFluxLec.BaseStream.Seek(0, IO.SeekOrigin.Begin)

While oFluxLec.Peek <> -1
sPlop = oFluxLec.ReadLine()
sRecherche2 = sPlop.Substring(0, 16)
sRegx = Regex.Match(sPlop, "(?<=#).[^;]*(?=;)").Value()
''dQte2 = System.Convert.ToDouble(sRegx)

If sRecherche2 = sRecherche Then
MessageBox.Show(sRecherche & vbCrLf & sRecherche2)
Else
'MessageBox.Show(sRecherche2 & vbCrLf & sRecherche)
End If

End While
'oFlux.Position() = lLigneO
'oFluxLec.BaseStream.Position() = lLigneO
oFluxLec.BaseStream.Seek(lLigneO, IO.SeekOrigin.Begin)
Loop

Catch oErreur As Exception
MessageBox.Show(oErreur.Message & vbCrLf & oErreur.ToString)
oFluxLec.Close()
'oFluxEcr.Close()
oFluxLec = Nothing
oFluxEcr = Nothing

Catch
oFluxLec.Close()
oFluxEcr.Close()
'sTempon = Nothing
End Try

End Sub

Le PB:
Je n'arrive pas à revenir à la position initiale :
'oFlux.Position() = lLigneO
'oFluxLec.BaseStream.Position() = lLigneO
oFluxLec.BaseStream.Seek(lLigneO, IO.SeekOrigin.Begin)


ne rend rien !
et donc à retourner dans la première boucle.

le type de fichier qu'il doit parser :
F40191937922____#145.31;F;1548;F40191__;010706;937922 AG010706;         145.31;PCFAC        ;AC_;AA0706;    ;300706;
F40191937922____#0.99;F;1548;F40191__;010706;937922 AG010706;         145.31;PCFAC        ;AC_;AA0706;    ;300706;
607100937922VIZZ#118.00;A;1548;607100__;010706;937922 AF010706;         118.00;PDFAC001548  ;AC_;AA0706;VIZZ;      ;
606400937922VIZZ#3.50;D;1548;606400__;010706;937922 AT010706;           3.50;PDFAC001548  ;AC_;AA0706;VIZZ;      ;

Les pb présentis :
+ Il n'y a pas de méthode get pour oFluxLec.BaseStream.Position()  il est nécessaire d'utiliser 
BaseStream.Seek

+ Mon fichier est en ASCII, vb utilise par défaut l'utf-8
+ Pour des raisons d'optimisation il se peut que la méthode position fonctionne par tranche de 1024 octets

En vous remerciant par avance pour votre aide précieuse.

1 réponse

ginkyo Messages postés 2 Date d'inscription jeudi 21 août 2003 Statut Membre Dernière intervention 21 août 2006
21 août 2006 à 10:14
à votre bon coeur msieur dame ....

(
"Il n'y a pas de méthode get pour oFluxLec.BaseStream.Position()  il est nécessaire d'utiliser  BaseStream.Seek"
Je voulais dire bien sûr :
Il n'y a pas de méthode SET pour oFluxLec.BaseStream.Position()  il est nécessaire d'utiliser  BaseStream.Seek
)
0
Rejoignez-nous