Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Écrire dans un fichier à un endroit précis

7 réponses
Avatar
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

7 réponses

Avatar
Bismark Prods
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" a écrit dans le message 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




Avatar
David Bouchard
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" <xanaia#nospam#@urbanet.ch> a écrit dans le message 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" a écrit dans le message 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
>
>




Avatar
Bismark Prods
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" a écrit dans le message de
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" <xanaia#nospam#@urbanet.ch> a écrit dans le message 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" a écrit dans le message 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
> >
> >
>
>




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

David

"Bismark Prods" <xanaia#nospam#@urbanet.ch> a écrit dans le message de
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" a écrit dans le message de
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" <xanaia#nospam#@urbanet.ch> a écrit dans le message 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" a écrit dans le message 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
> > >
> > >
> >
> >
>
>




Avatar
Bismark Prods
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
Avatar
Bismark Prods
Petite correction... il y a un CType(...,int32) de trop ! Il faut l'enlever
si tu utilise des gros fichiers.

Bismark

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

David

"Bismark Prods" <xanaia#nospam#@urbanet.ch> a écrit dans le message de
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" a écrit dans le message de
> 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" <xanaia#nospam#@urbanet.ch> a écrit dans le message 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" a écrit dans le message


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
> > > >
> > > >
> > >
> > >
> >
> >
>
>




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

David

"Bismark Prods" <xanaia#nospam#@urbanet.ch> a écrit dans le message de
news:
Petite correction... il y a un CType(...,int32) de trop ! Il faut


l'enlever
si tu utilise des gros fichiers.

Bismark

"David Bouchard" a écrit dans le message de
news:
> Merci beaucoup, j'ai pas testé mais aussitot le temps venu, j'essaye ça.
>
> David
>
> "Bismark Prods" <xanaia#nospam#@urbanet.ch> a écrit dans le message de
> 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" a écrit dans le message de
> > 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" <xanaia#nospam#@urbanet.ch> a écrit dans le message


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" a écrit dans le message
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
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>