OVH Cloud OVH Cloud

fichier texte

6 réponses
Avatar
Shewy80
(Désolé si ce message est affichée 2fois mais celui-ci ne s'est pas affiché
avec outlook)

Bonjour à tous

Une question toute simple, mais qui me [biiipp] depuis un peu de temps

Je voudrai accéder à la ligne n d'un fichier texte. Comment puis-je faire ??
Je crois que c'est de l'acces direct?

n=5 (par expl)

Open liste For random As #1
get #1, n , texte0
close #1

vl'a un début ... (mais ça marche po!)
Comment mettre dans texte0 le contenu de la ligne 'N' de mon fichier texte
liste ouvert en #1 ?
voilà c plus clair comme ça ...

Merci !


voilà comment se présente mon fichier texte:

Titre1;Titre2;Titre3;Titre4;Titre5;Titre6;Titre7;Titre8;Titre9
Donnée1-1;Donnée2;Donnée3;Donnée4;Donnée5;Donnée6;Donnée7;Donnée8;Donnée9
Donnée2-1;Donnée2;Donnée3;Donnée4;Donnée5;Donnée6;Donnée7;Donnée8;Donnée9
Donnée3-1;Donnée2;Donnée3;Donnée4;Donnée5;Donnée6;Donnée7;Donnée8;Donnée9
Donnée4-1;Donnée2;Donnée3;Donnée4;Donnée5;Donnée6;Donnée7;Donnée8;Donnée9

6 réponses

Avatar
Shewy80
je viens de trouver une solution à mon probléme.
QQ1 peut il me dire s'il y a une autre solution, ou bien si cela risque de
poser des problèmes.
Actuellemnt ça marche nikel comme je veux. Mais mon fichier TXT ne fais
qu'une 10aine de lignes....

si vous voyez des choses à améliorer, ou une autre façon de faire : je veux
bien de vos explcations !!

Merci à vous tous !


(Architecture du fichier texte dans mess. précédent)




Private Sub MSFlexGrid1_DblClick()

Dim ligne As Integer
Dim texte0 As String
Dim texten As String
Dim tableau1() As String
Dim tableau2() As String
Dim cpt1 As Integer
Dim cpt2 As Integer
Dim i As Integer


Label1.Caption = ""
Frame1.Caption = "Col:Lig [ " & MSFlexGrid1.Col & " : " & MSFlexGrid1.Row &
" ] "

If testFich.FichierExiste(liste) = False Then
MsgBox "Fichier non Valide! Les données sont perdues"
Unload Me
Exit Sub
End If

'Double clic sur une ligne, récup son num dans une variable
ligne = MSFlexGrid1.Row

Open liste For Input As #1
'récupération de la prem ligne dans texte0
Line Input #1, texte0
'je coupe les champs que je répartis dans un tableau
cpt1 = lstchaine.DecouperChaine(texte0, ";", tableau1)

'Récupération ligne n, par acces séquentiel
For i = 0 To ligne - 1
Line Input #1, texten
Next
'je coupe les champs que je répartis dans un second tableau
cpt2 = lstchaine.DecouperChaine(texten, ";", tableau2)

Close #1

'Affichage vertical dans un label "Titre:Donnée"
For i = 1 To cpt1
texte0 = tableau1(i)
texten = tableau2(i)
Label1.Caption = Label1.Caption & texte0 & " : " & texten & vbCrLf
Next

End Sub
Avatar
ng
Salut,

C'est en effet une solution fonctionnelle mais si ton fichier est conséquent
ca va trainer un peu, tu peux essayer ceci :

Dim k As Integer, strBuffer As String, tblLine() As String

k = FreeFile
Open "c:debug.log" For Binary As #k
strBuffer = String$(LOF(k), vbNullChar)
Get #k, , strBuffer
Close #k

tblLine = Split(strBuffer, vbCrLf): strBuffer = ""

MsgBox tblLine(5 - 1) '//ligne 5

Erase tblLine

Mais là encore on charge la totalité du fichier, on pourrait donc optmiser
davantage ce qui permettra de travailler sur de très gros fichiers si on
veut récupérer *une* *seule* *ligne* (sinon on utilise la fonction
ci-dessus).

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Shewy80 wrote:
je viens de trouver une solution à mon probléme.
QQ1 peut il me dire s'il y a une autre solution, ou bien si cela
risque de poser des problèmes.
Actuellemnt ça marche nikel comme je veux. Mais mon fichier TXT ne
fais qu'une 10aine de lignes....

si vous voyez des choses à améliorer, ou une autre façon de faire :
je veux bien de vos explcations !!

Merci à vous tous !


(Architecture du fichier texte dans mess. précédent)




Private Sub MSFlexGrid1_DblClick()

Dim ligne As Integer
Dim texte0 As String
Dim texten As String
Dim tableau1() As String
Dim tableau2() As String
Dim cpt1 As Integer
Dim cpt2 As Integer
Dim i As Integer


Label1.Caption = ""
Frame1.Caption = "Col:Lig [ " & MSFlexGrid1.Col & " : " &
MSFlexGrid1.Row & " ] "

If testFich.FichierExiste(liste) = False Then
MsgBox "Fichier non Valide! Les données sont perdues"
Unload Me
Exit Sub
End If

'Double clic sur une ligne, récup son num dans une variable
ligne = MSFlexGrid1.Row

Open liste For Input As #1
'récupération de la prem ligne dans texte0
Line Input #1, texte0
'je coupe les champs que je répartis dans un tableau
cpt1 = lstchaine.DecouperChaine(texte0, ";", tableau1)

'Récupération ligne n, par acces séquentiel
For i = 0 To ligne - 1
Line Input #1, texten
Next
'je coupe les champs que je répartis dans un second tableau
cpt2 = lstchaine.DecouperChaine(texten, ";", tableau2)

Close #1

'Affichage vertical dans un label "Titre:Donnée"
For i = 1 To cpt1
texte0 = tableau1(i)
texten = tableau2(i)
Label1.Caption = Label1.Caption & texte0 & " : " & texten & vbCrLf
Next

End Sub


Avatar
Patrice Henrio
Encore faut-il que toutes les lignes utilisent le même nombre d'octets, seul
moyen de faire de l'accès direct ou mieux nommé de "l'accès calculé" puisque
l'adresse dans le fichier de l'enregistrement N est calculé par
(N-1)*longueur de l'enregistrement + 1


"ng" a écrit dans le message de news:
%
Salut,

C'est en effet une solution fonctionnelle mais si ton fichier est
conséquent ca va trainer un peu, tu peux essayer ceci :

Dim k As Integer, strBuffer As String, tblLine() As String

k = FreeFile
Open "c:debug.log" For Binary As #k
strBuffer = String$(LOF(k), vbNullChar)
Get #k, , strBuffer
Close #k

tblLine = Split(strBuffer, vbCrLf): strBuffer = ""

MsgBox tblLine(5 - 1) '//ligne 5

Erase tblLine

Mais là encore on charge la totalité du fichier, on pourrait donc optmiser
davantage ce qui permettra de travailler sur de très gros fichiers si on
veut récupérer *une* *seule* *ligne* (sinon on utilise la fonction
ci-dessus).

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Shewy80 wrote:
je viens de trouver une solution à mon probléme.
QQ1 peut il me dire s'il y a une autre solution, ou bien si cela
risque de poser des problèmes.
Actuellemnt ça marche nikel comme je veux. Mais mon fichier TXT ne
fais qu'une 10aine de lignes....

si vous voyez des choses à améliorer, ou une autre façon de faire :
je veux bien de vos explcations !!

Merci à vous tous !


(Architecture du fichier texte dans mess. précédent)




Private Sub MSFlexGrid1_DblClick()

Dim ligne As Integer
Dim texte0 As String
Dim texten As String
Dim tableau1() As String
Dim tableau2() As String
Dim cpt1 As Integer
Dim cpt2 As Integer
Dim i As Integer


Label1.Caption = ""
Frame1.Caption = "Col:Lig [ " & MSFlexGrid1.Col & " : " &
MSFlexGrid1.Row & " ] "

If testFich.FichierExiste(liste) = False Then
MsgBox "Fichier non Valide! Les données sont perdues"
Unload Me
Exit Sub
End If

'Double clic sur une ligne, récup son num dans une variable
ligne = MSFlexGrid1.Row

Open liste For Input As #1
'récupération de la prem ligne dans texte0
Line Input #1, texte0
'je coupe les champs que je répartis dans un tableau
cpt1 = lstchaine.DecouperChaine(texte0, ";", tableau1)

'Récupération ligne n, par acces séquentiel
For i = 0 To ligne - 1
Line Input #1, texten
Next
'je coupe les champs que je répartis dans un second tableau
cpt2 = lstchaine.DecouperChaine(texten, ";", tableau2)

Close #1

'Affichage vertical dans un label "Titre:Donnée"
For i = 1 To cpt1
texte0 = tableau1(i)
texten = tableau2(i)
Label1.Caption = Label1.Caption & texte0 & " : " & texten & vbCrLf
Next

End Sub






Avatar
ng
Salut,

Non avec ma sub les lignes peuvent avoir des tailles différentes.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Patrice Henrio wrote:
Encore faut-il que toutes les lignes utilisent le même nombre
d'octets, seul moyen de faire de l'accès direct ou mieux nommé de
"l'accès calculé" puisque l'adresse dans le fichier de
l'enregistrement N est calculé par (N-1)*longueur de l'enregistrement
+ 1

"ng" a écrit dans le message de news:
%
Salut,

C'est en effet une solution fonctionnelle mais si ton fichier est
conséquent ca va trainer un peu, tu peux essayer ceci :

Dim k As Integer, strBuffer As String, tblLine() As String

k = FreeFile
Open "c:debug.log" For Binary As #k
strBuffer = String$(LOF(k), vbNullChar)
Get #k, , strBuffer
Close #k

tblLine = Split(strBuffer, vbCrLf): strBuffer = ""

MsgBox tblLine(5 - 1) '//ligne 5

Erase tblLine

Mais là encore on charge la totalité du fichier, on pourrait donc
optmiser davantage ce qui permettra de travailler sur de très gros
fichiers si on veut récupérer *une* *seule* *ligne* (sinon on
utilise la fonction ci-dessus).

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Shewy80 wrote:
je viens de trouver une solution à mon probléme.
QQ1 peut il me dire s'il y a une autre solution, ou bien si cela
risque de poser des problèmes.
Actuellemnt ça marche nikel comme je veux. Mais mon fichier TXT ne
fais qu'une 10aine de lignes....

si vous voyez des choses à améliorer, ou une autre façon de faire :
je veux bien de vos explcations !!

Merci à vous tous !


(Architecture du fichier texte dans mess. précédent)




Private Sub MSFlexGrid1_DblClick()

Dim ligne As Integer
Dim texte0 As String
Dim texten As String
Dim tableau1() As String
Dim tableau2() As String
Dim cpt1 As Integer
Dim cpt2 As Integer
Dim i As Integer


Label1.Caption = ""
Frame1.Caption = "Col:Lig [ " & MSFlexGrid1.Col & " : " &
MSFlexGrid1.Row & " ] "

If testFich.FichierExiste(liste) = False Then
MsgBox "Fichier non Valide! Les données sont perdues"
Unload Me
Exit Sub
End If

'Double clic sur une ligne, récup son num dans une variable
ligne = MSFlexGrid1.Row

Open liste For Input As #1
'récupération de la prem ligne dans texte0
Line Input #1, texte0
'je coupe les champs que je répartis dans un tableau
cpt1 = lstchaine.DecouperChaine(texte0, ";", tableau1)

'Récupération ligne n, par acces séquentiel
For i = 0 To ligne - 1
Line Input #1, texten
Next
'je coupe les champs que je répartis dans un second tableau
cpt2 = lstchaine.DecouperChaine(texten, ";", tableau2)

Close #1

'Affichage vertical dans un label "Titre:Donnée"
For i = 1 To cpt1
texte0 = tableau1(i)
texten = tableau2(i)
Label1.Caption = Label1.Caption & texte0 & " : " & texten & vbCrLf
Next

End Sub






Avatar
Géo
ng a écrit:
Salut,

Non avec ma sub les lignes peuvent avoir des tailles différentes.




Si tu veux persister avec les fichiers textes, pourquoi pas un fichier a
acces aleatoire, tu crees une variable de ton type,
et ensuite en divisant la taille de ton fichier texte par la taille
d'une de tes variables perso tu as le nbre d'enregistrement, l'acces a
un enregistrement donnee, etc ...

l'ancetre de la BDD ( je pratiquais cela sur le GWBasic du DOS et ca
marchait tres bien !)


Géo
Avatar
YannX
"Géo" a écrit dans le message de
news:
ng a écrit:
> Salut,
>
> Non avec ma sub les lignes peuvent avoir des tailles différentes.
>

Si tu veux persister avec les fichiers textes, pourquoi pas un fichier a
acces aleatoire, tu crees une variable de ton type,
et ensuite en divisant la taille de ton fichier texte par la taille
d'une de tes variables perso tu as le nbre d'enregistrement, l'acces a
un enregistrement donnee, etc ...

l'ancetre de la BDD ( je pratiquais cela sur le GWBasic du DOS et ca
marchait tres bien !)



Et pour faire "encore plus simple", mais les performances sont.......
Function Get_LigneK(i&, k&) as string
Open liste For Input As #i
'récupération de la prem ligne dans texte0
'Récupération ligne n, par acces séquentiel
For i = 0 To ligne - 1
Line Input #1, texte
Next
Line Input #1, texte
Get_ligneK = texte
End

Cela s'appelle de l'accès direct (sur bande 6250 bpi pour les adeptes.....)

Joking
Y