Écrire dans un fichier à un endroit précis

Le
David Bouchard
Je cherche à écrire dans un fichier text une valeur à un endroit précis. En
faite, j'ai un fichier text remplis de données sous forme de tableau et je
voudrais par exemple pouvoir modifier la valeur de la troisième colonne, 5e
ligne. Je suis capable facilement de trouver la position ou je dois
commencer à écrire mais je ne sais pas comment faire pour dire exemple :
write(ligne no5, position 34e char, valeur)

Merci de votre aide

David
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Bismark Prods
Le #12546411
Hello, ca devrait donner à peu près ca... mais j'ai pas testé.

Public Shared Sub WriteIntoFile(ByVal Filename As String, ByVal Offset As
Int32, ByVal Length As Int32, ByVal Data() As Byte)
Try
Dim fs As System.IO.FileStream = New System.IO.FileStream(Filename,
IO.FileMode.Open, IO.FileAccess.Write, IO.FileShare.None)
Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
bw.Seek(Offset, IO.SeekOrigin.Begin)
bw.Write(Data, 0, Length)
bw.Close()
bw = Nothing
fs.Close()
fs = Nothing
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Sub

Bonne prog'

bismark

"David Bouchard" news:eoN$4j%
Je cherche à écrire dans un fichier text une valeur à un endroit précis.


En
faite, j'ai un fichier text remplis de données sous forme de tableau et je
voudrais par exemple pouvoir modifier la valeur de la troisième colonne,


5e
ligne. Je suis capable facilement de trouver la position ou je dois
commencer à écrire mais je ne sais pas comment faire pour dire exemple :
write(ligne no5, position 34e char, valeur)

Merci de votre aide

David




David Bouchard
Le #12546401
Merci, ca fonctionne mais en partie puisque j'aimerais non pas remplacé le
text déjà existant mais plutot insérer du text entre des caractères déja
présent.
Est-ce possible?
Merci

David

"Bismark Prods" news:eX5UU1%
Hello, ca devrait donner à peu près ca... mais j'ai pas testé.

Public Shared Sub WriteIntoFile(ByVal Filename As String, ByVal Offset As
Int32, ByVal Length As Int32, ByVal Data() As Byte)
Try
Dim fs As System.IO.FileStream = New System.IO.FileStream(Filename,
IO.FileMode.Open, IO.FileAccess.Write, IO.FileShare.None)
Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
bw.Seek(Offset, IO.SeekOrigin.Begin)
bw.Write(Data, 0, Length)
bw.Close()
bw = Nothing
fs.Close()
fs = Nothing
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Sub

Bonne prog'

bismark

"David Bouchard" news:eoN$4j%
> Je cherche à écrire dans un fichier text une valeur à un endroit précis.
En
> faite, j'ai un fichier text remplis de données sous forme de tableau et


je
> voudrais par exemple pouvoir modifier la valeur de la troisième colonne,
5e
> ligne. Je suis capable facilement de trouver la position ou je dois
> commencer à écrire mais je ne sais pas comment faire pour dire exemple :
> write(ligne no5, position 34e char, valeur)
>
> Merci de votre aide
>
> David
>
>




Bismark Prods
Le #12546391
Hello,

Ca donnerait donc quelque chose comme ca... mais je ne suis pas satisfait du
Stringbuilder... Si j'avais pris plus de temps j'aurais sans doute utilisé
une autre sorte d'objet tel un tableau ou une collection. Je ne sais pas.

Public Shared Sub InsertIntoFileB(ByVal Filename As String, ByVal Offset As
Int32, ByVal Length As Int32, ByVal Data() As Char)
Try
Dim fs As System.IO.FileStream = New System.IO.FileStream(Filename,
IO.FileMode.Open, IO.FileAccess.Read)
Dim br As System.IO.BinaryReader = New System.IO.BinaryReader(fs)
'Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
Dim sb As System.Text.StringBuilder = New
System.Text.StringBuilder(CType(fs.Length, Int32))
Dim buf(CType(fs.Length, Int32)) As Char
br.Read(buf, 0, buf.Length)
sb.Append(buf)
sb.Insert(Offset, Data, 0, Length)
br.Close()
br = Nothing
fs.Close()
fs = Nothing
System.IO.File.Delete(Filename)
fs = New System.IO.FileStream(Filename, IO.FileMode.Create,
IO.FileAccess.Write)
Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
bw.Write(sb.ToString.ToCharArray, 0, sb.Length)
bw.Close()
bw = Nothing
fs.Close()
fs = Nothing
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Sub

Bismark


"David Bouchard" news:%
Merci, ca fonctionne mais en partie puisque j'aimerais non pas remplacé le
text déjà existant mais plutot insérer du text entre des caractères déja
présent.
Est-ce possible?
Merci

David

"Bismark Prods" news:eX5UU1%
> Hello, ca devrait donner à peu près ca... mais j'ai pas testé.
>
> Public Shared Sub WriteIntoFile(ByVal Filename As String, ByVal Offset


As
> Int32, ByVal Length As Int32, ByVal Data() As Byte)
> Try
> Dim fs As System.IO.FileStream = New System.IO.FileStream(Filename,
> IO.FileMode.Open, IO.FileAccess.Write, IO.FileShare.None)
> Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
> bw.Seek(Offset, IO.SeekOrigin.Begin)
> bw.Write(Data, 0, Length)
> bw.Close()
> bw = Nothing
> fs.Close()
> fs = Nothing
> Catch ex As Exception
> Throw New Exception(ex.Message)
> End Try
> End Sub
>
> Bonne prog'
>
> bismark
>
> "David Bouchard" > news:eoN$4j%
> > Je cherche à écrire dans un fichier text une valeur à un endroit


précis.
> En
> > faite, j'ai un fichier text remplis de données sous forme de tableau


et
je
> > voudrais par exemple pouvoir modifier la valeur de la troisième


colonne,
> 5e
> > ligne. Je suis capable facilement de trouver la position ou je dois
> > commencer à écrire mais je ne sais pas comment faire pour dire exemple


:
> > write(ligne no5, position 34e char, valeur)
> >
> > Merci de votre aide
> >
> > David
> >
> >
>
>




David Bouchard
Le #12546381
Merci beaucoup, j'ai pas testé mais aussitot le temps venu, j'essaye ça.

David

"Bismark Prods" news:
Hello,

Ca donnerait donc quelque chose comme ca... mais je ne suis pas satisfait


du
Stringbuilder... Si j'avais pris plus de temps j'aurais sans doute utilisé
une autre sorte d'objet tel un tableau ou une collection. Je ne sais pas.

Public Shared Sub InsertIntoFileB(ByVal Filename As String, ByVal Offset


As
Int32, ByVal Length As Int32, ByVal Data() As Char)
Try
Dim fs As System.IO.FileStream = New System.IO.FileStream(Filename,
IO.FileMode.Open, IO.FileAccess.Read)
Dim br As System.IO.BinaryReader = New System.IO.BinaryReader(fs)
'Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
Dim sb As System.Text.StringBuilder = New
System.Text.StringBuilder(CType(fs.Length, Int32))
Dim buf(CType(fs.Length, Int32)) As Char
br.Read(buf, 0, buf.Length)
sb.Append(buf)
sb.Insert(Offset, Data, 0, Length)
br.Close()
br = Nothing
fs.Close()
fs = Nothing
System.IO.File.Delete(Filename)
fs = New System.IO.FileStream(Filename, IO.FileMode.Create,
IO.FileAccess.Write)
Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
bw.Write(sb.ToString.ToCharArray, 0, sb.Length)
bw.Close()
bw = Nothing
fs.Close()
fs = Nothing
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Sub

Bismark


"David Bouchard" news:%
> Merci, ca fonctionne mais en partie puisque j'aimerais non pas remplacé


le
> text déjà existant mais plutot insérer du text entre des caractères déja
> présent.
> Est-ce possible?
> Merci
>
> David
>
> "Bismark Prods" > news:eX5UU1%
> > Hello, ca devrait donner à peu près ca... mais j'ai pas testé.
> >
> > Public Shared Sub WriteIntoFile(ByVal Filename As String, ByVal Offset
As
> > Int32, ByVal Length As Int32, ByVal Data() As Byte)
> > Try
> > Dim fs As System.IO.FileStream = New


System.IO.FileStream(Filename,
> > IO.FileMode.Open, IO.FileAccess.Write, IO.FileShare.None)
> > Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
> > bw.Seek(Offset, IO.SeekOrigin.Begin)
> > bw.Write(Data, 0, Length)
> > bw.Close()
> > bw = Nothing
> > fs.Close()
> > fs = Nothing
> > Catch ex As Exception
> > Throw New Exception(ex.Message)
> > End Try
> > End Sub
> >
> > Bonne prog'
> >
> > bismark
> >
> > "David Bouchard" > > news:eoN$4j%
> > > Je cherche à écrire dans un fichier text une valeur à un endroit
précis.
> > En
> > > faite, j'ai un fichier text remplis de données sous forme de tableau
et
> je
> > > voudrais par exemple pouvoir modifier la valeur de la troisième
colonne,
> > 5e
> > > ligne. Je suis capable facilement de trouver la position ou je dois
> > > commencer à écrire mais je ne sais pas comment faire pour dire


exemple
:
> > > write(ligne no5, position 34e char, valeur)
> > >
> > > Merci de votre aide
> > >
> > > David
> > >
> > >
> >
> >
>
>




Bismark Prods
Le #12546361
Hello David,

Voila une version que j'ai testée et qui fonctionne bien jusqu'ici !

Public Shared Sub InsertIntoFileB(ByVal Filename As String, ByVal Offset As
Int32, ByVal Length As Int32, ByVal Data() As Char)
Try
Dim fs As System.IO.FileStream = New System.IO.FileStream(Filename,
IO.FileMode.Open, IO.FileAccess.Read)
Dim br As System.IO.BinaryReader = New System.IO.BinaryReader(fs)
'Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
Dim tab(fs.Length - 1 + Length) As Char
'Dim sb As System.Text.StringBuilder = New
System.Text.StringBuilder(CType(fs.Length, Int32))
Dim buf(CType(fs.Length - 1, Int32)) As Char
br.Read(buf, 0, buf.Length)
If Offset <= 0 Then Offset = 1
'Si Offset = 1 alors on veut insérer depuis le 1er caractère.
If Not Offset = 1 Then
Array.Copy(buf, 0, tab, 0, Offset - 1) 'copie du texte se
trouvant avant le point d'insertion demandé
End If
'On copie les données que l'on veut insérer à l'index Offset -1
Array.Copy(Data, 0, tab, Offset - 1, Length)
'On ferme la marche en copiant le reste des données à la fin
Array.Copy(buf, Offset - 1, tab, (Offset - 1) + Length, buf.Length -
(Offset - 1))
br.Close()
br = Nothing
fs.Close()
fs = Nothing
System.IO.File.Delete(Filename)
fs = New System.IO.FileStream(Filename, IO.FileMode.Create,
IO.FileAccess.Write)
Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
bw.Write(tab, 0, tab.Length)
'Array.Clear(tab, 0, tab.Length)
bw.Close()
bw = Nothing
fs.Close()
fs = Nothing
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
End Sub

Merci à toi de m'avoir fait programmer cette méthode très intéressante !

Bismark
Bismark Prods
Le #12546351
Petite correction... il y a un CType(...,int32) de trop ! Il faut l'enlever
si tu utilise des gros fichiers.

Bismark

"David Bouchard" news:
Merci beaucoup, j'ai pas testé mais aussitot le temps venu, j'essaye ça.

David

"Bismark Prods" news:
> Hello,
>
> Ca donnerait donc quelque chose comme ca... mais je ne suis pas


satisfait
du
> Stringbuilder... Si j'avais pris plus de temps j'aurais sans doute


utilisé
> une autre sorte d'objet tel un tableau ou une collection. Je ne sais


pas.
>
> Public Shared Sub InsertIntoFileB(ByVal Filename As String, ByVal Offset
As
> Int32, ByVal Length As Int32, ByVal Data() As Char)
> Try
> Dim fs As System.IO.FileStream = New System.IO.FileStream(Filename,
> IO.FileMode.Open, IO.FileAccess.Read)
> Dim br As System.IO.BinaryReader = New System.IO.BinaryReader(fs)
> 'Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
> Dim sb As System.Text.StringBuilder = New
> System.Text.StringBuilder(CType(fs.Length, Int32))
> Dim buf(CType(fs.Length, Int32)) As Char
> br.Read(buf, 0, buf.Length)
> sb.Append(buf)
> sb.Insert(Offset, Data, 0, Length)
> br.Close()
> br = Nothing
> fs.Close()
> fs = Nothing
> System.IO.File.Delete(Filename)
> fs = New System.IO.FileStream(Filename, IO.FileMode.Create,
> IO.FileAccess.Write)
> Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
> bw.Write(sb.ToString.ToCharArray, 0, sb.Length)
> bw.Close()
> bw = Nothing
> fs.Close()
> fs = Nothing
> Catch ex As Exception
> Throw New Exception(ex.Message)
> End Try
> End Sub
>
> Bismark
>
>
> "David Bouchard" > news:%
> > Merci, ca fonctionne mais en partie puisque j'aimerais non pas


remplacé
le
> > text déjà existant mais plutot insérer du text entre des caractères


déja
> > présent.
> > Est-ce possible?
> > Merci
> >
> > David
> >
> > "Bismark Prods" > > news:eX5UU1%
> > > Hello, ca devrait donner à peu près ca... mais j'ai pas testé.
> > >
> > > Public Shared Sub WriteIntoFile(ByVal Filename As String, ByVal


Offset
> As
> > > Int32, ByVal Length As Int32, ByVal Data() As Byte)
> > > Try
> > > Dim fs As System.IO.FileStream = New
System.IO.FileStream(Filename,
> > > IO.FileMode.Open, IO.FileAccess.Write, IO.FileShare.None)
> > > Dim bw As System.IO.BinaryWriter = New


System.IO.BinaryWriter(fs)
> > > bw.Seek(Offset, IO.SeekOrigin.Begin)
> > > bw.Write(Data, 0, Length)
> > > bw.Close()
> > > bw = Nothing
> > > fs.Close()
> > > fs = Nothing
> > > Catch ex As Exception
> > > Throw New Exception(ex.Message)
> > > End Try
> > > End Sub
> > >
> > > Bonne prog'
> > >
> > > bismark
> > >
> > > "David Bouchard"

de
> > > news:eoN$4j%
> > > > Je cherche à écrire dans un fichier text une valeur à un endroit
> précis.
> > > En
> > > > faite, j'ai un fichier text remplis de données sous forme de


tableau
> et
> > je
> > > > voudrais par exemple pouvoir modifier la valeur de la troisième
> colonne,
> > > 5e
> > > > ligne. Je suis capable facilement de trouver la position ou je


dois
> > > > commencer à écrire mais je ne sais pas comment faire pour dire
exemple
> :
> > > > write(ligne no5, position 34e char, valeur)
> > > >
> > > > Merci de votre aide
> > > >
> > > > David
> > > >
> > > >
> > >
> > >
> >
> >
>
>




David Bouchard
Le #12545901
C'est génial, ça fonctionne numéro 1, merci beaucoup

David

"Bismark Prods" news:
Petite correction... il y a un CType(...,int32) de trop ! Il faut


l'enlever
si tu utilise des gros fichiers.

Bismark

"David Bouchard" news:
> Merci beaucoup, j'ai pas testé mais aussitot le temps venu, j'essaye ça.
>
> David
>
> "Bismark Prods" > news:
> > Hello,
> >
> > Ca donnerait donc quelque chose comme ca... mais je ne suis pas
satisfait
> du
> > Stringbuilder... Si j'avais pris plus de temps j'aurais sans doute
utilisé
> > une autre sorte d'objet tel un tableau ou une collection. Je ne sais
pas.
> >
> > Public Shared Sub InsertIntoFileB(ByVal Filename As String, ByVal


Offset
> As
> > Int32, ByVal Length As Int32, ByVal Data() As Char)
> > Try
> > Dim fs As System.IO.FileStream = New


System.IO.FileStream(Filename,
> > IO.FileMode.Open, IO.FileAccess.Read)
> > Dim br As System.IO.BinaryReader = New System.IO.BinaryReader(fs)
> > 'Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
> > Dim sb As System.Text.StringBuilder = New
> > System.Text.StringBuilder(CType(fs.Length, Int32))
> > Dim buf(CType(fs.Length, Int32)) As Char
> > br.Read(buf, 0, buf.Length)
> > sb.Append(buf)
> > sb.Insert(Offset, Data, 0, Length)
> > br.Close()
> > br = Nothing
> > fs.Close()
> > fs = Nothing
> > System.IO.File.Delete(Filename)
> > fs = New System.IO.FileStream(Filename, IO.FileMode.Create,
> > IO.FileAccess.Write)
> > Dim bw As System.IO.BinaryWriter = New System.IO.BinaryWriter(fs)
> > bw.Write(sb.ToString.ToCharArray, 0, sb.Length)
> > bw.Close()
> > bw = Nothing
> > fs.Close()
> > fs = Nothing
> > Catch ex As Exception
> > Throw New Exception(ex.Message)
> > End Try
> > End Sub
> >
> > Bismark
> >
> >
> > "David Bouchard" > > news:%
> > > Merci, ca fonctionne mais en partie puisque j'aimerais non pas
remplacé
> le
> > > text déjà existant mais plutot insérer du text entre des caractères
déja
> > > présent.
> > > Est-ce possible?
> > > Merci
> > >
> > > David
> > >
> > > "Bismark Prods"

de
> > > news:eX5UU1%
> > > > Hello, ca devrait donner à peu près ca... mais j'ai pas testé.
> > > >
> > > > Public Shared Sub WriteIntoFile(ByVal Filename As String, ByVal
Offset
> > As
> > > > Int32, ByVal Length As Int32, ByVal Data() As Byte)
> > > > Try
> > > > Dim fs As System.IO.FileStream = New
> System.IO.FileStream(Filename,
> > > > IO.FileMode.Open, IO.FileAccess.Write, IO.FileShare.None)
> > > > Dim bw As System.IO.BinaryWriter = New
System.IO.BinaryWriter(fs)
> > > > bw.Seek(Offset, IO.SeekOrigin.Begin)
> > > > bw.Write(Data, 0, Length)
> > > > bw.Close()
> > > > bw = Nothing
> > > > fs.Close()
> > > > fs = Nothing
> > > > Catch ex As Exception
> > > > Throw New Exception(ex.Message)
> > > > End Try
> > > > End Sub
> > > >
> > > > Bonne prog'
> > > >
> > > > bismark
> > > >
> > > > "David Bouchard" de
> > > > news:eoN$4j%
> > > > > Je cherche à écrire dans un fichier text une valeur à un endroit
> > précis.
> > > > En
> > > > > faite, j'ai un fichier text remplis de données sous forme de
tableau
> > et
> > > je
> > > > > voudrais par exemple pouvoir modifier la valeur de la troisième
> > colonne,
> > > > 5e
> > > > > ligne. Je suis capable facilement de trouver la position ou je
dois
> > > > > commencer à écrire mais je ne sais pas comment faire pour dire
> exemple
> > :
> > > > > write(ligne no5, position 34e char, valeur)
> > > > >
> > > > > Merci de votre aide
> > > > >
> > > > > David
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Publicité
Poster une réponse
Anonyme