Lecture de fichier txt avec fonction Split

tonbosto Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 16 mars 2008 - 16 mars 2008 à 14:07
tonbosto Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 16 mars 2008 - 16 mars 2008 à 23:13
Bonjour ,

J'essaie de lire un fichier txt de la forme suivante:
 5.0000000E+00   .0000000E+00  2.5000000E+01
-5.0000000E+00   .0000000E+00  2.5000000E+01
 5.0000000E+00   .0000000E+00  1.2990381E+01
-5.0000000E+00   .0000000E+00  1.2990381E+01
 5.0000000E+00 -1.0000000E+01   .0000000E+00
...

J'arrive à lire les lignes, mais je dois stocker les différentes valeur de ce fichier dans trois colonnes.
J'utilise la fonction Split pour differencier les trois termes d'une ligne, mais à la deuxiéme ligne , le -5.000... n'est pas stocké.
J'ai essaié en enlevant le "-" et la ca fonctionne, donc le probléme viendrai de ce signe.
Par la suite j'ai une erreur après la ligne 2 du fichier txt.

Voici le code :

Try

Dim monFichier
As StreammonFichier = File.OpenRead(Chemin)

Dim monStreamReader
As
New StreamReader(monFichier, System.Text.Encoding.ASCII)
'Stream pour la lecture

Dim ligne
As
String
' Variable contenant le texte de la ligne

Dim Stock()
As
String

ligne = 0
MsgBox(

"coucou")

While monStreamReader.Peek() > -1ligne = monStreamReader.ReadLine

'lecture de la ligneMsgBox(ligne, MsgBoxStyle.OkCancel)

'TRAITEMENT A EFFECTUER SUR LA LIGNEStock = Split(ligne,

" ")

If Stock(1) <>
""
ThenMsgBox(Stock(1))

End
If

If Stock(2) <>
""
ThenMsgBox(Stock(2))

End
If

If Stock(3) <>
""
ThenMsgBox(Stock(3))

End
If

If Stock(4) <>
""
ThenMsgBox(Stock(4))

End
If

'MsgBox(Stock(5))

End
WhileMsgBox(

"finProcess")monStreamReader.Close()

Catch ex
As ExceptionMsgBox(

"Une erreur est survenue au cours de l'accès en lecture du fichier de configuration du logiciel.")

End
Try

Else : MsgBox(
"Veuillez spécifier un chemin de fichier valide", MsgBoxStyle.Exclamation)

End
If
Merci bien de vos aides.

10 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
16 mars 2008 à 15:43
Le problème viens du fait que tu fat un split sur l'espace, ensuite tu considère que ta première valeur est renvoyer dans la seconde colonne (index 1) et pour cause, la première ligne commence par un espace. LA fonction Split considèrera donc  que tu as une colonne vide en début de ligne.

Ce qu'il faut que tu fasse, je pense c'est systématiquement supprimer les espaces en début de chaque ligne (voir méthode Trim) avant de faire le split.
De ce fait ainsi la première valeur sera dans la première colonne (index 0) et tu devrait la récupérer aussi lorsque qu'elle est négative.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
tonbosto Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 17:49
Merci pour la piste mais je viens d'enlever  à la main les espaces en début de ligne.
Il ne me prend meme plus la première valeur de la ligne et s'arrete à la fin de celle ci.

As tu d'autre piste ?
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
16 mars 2008 à 18:14
Ce code devrait pourtant marcher :

Try
  Dim monFichier As Stream
  monFichier = File.OpenRead(Chemin)

  Dim monStreamReader As New StreamReader(monFichier, System.Text.Encoding.ASCII) 'Stream pour la lecture
  Dim ligne As String ' Variable contenant le texte de la ligne
  Dim Stock() As String

  ligne = ""
  MsgBox("coucou")

  While monStreamReader.Peek() > -1
    ligne = monStreamReader.ReadLine 'lecture de la ligne
    MsgBox(ligne, MsgBoxStyle.OkCancel)

    'TRAITEMENT A EFFECTUER SUR LA LIGNE
    Stock = Split(ligne.TrimStart," ")

    If Stock(0) <> "" Then MsgBox(Stock(0))
    If Stock(1) <> "" Then MsgBox(Stock(1))
    If Stock(2) <> "" Then MsgBox(Stock(2))
    If Stock(3) <> "" Then MsgBox(Stock(3))
  End While
  MsgBox("finProcess")
  monStreamReader.Close()
Catch ex As Exception
  MsgBox("Une erreur est survenue au cours de l'accès en lecture du fichier de configuration du logiciel.")
End Try

Je ne peux malheureusement pas le tester, j'ai VB2005 en rade en ce moment, je vais etre obliger de fromater je pense

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
tonbosto Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 18:54
Merci beaucoup Casy, il fonctionne deja mieux ^^.
La il me plante à la 5eme ligne au niveau du 5.0000..-1.000, il me les mets dans "la même case".

Mais merci de l'avancement .

A toute
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
16 mars 2008 à 19:05
arf, vérifie que tu as bien un espace qui te sépare les 2 valeurs.

Si ce n'est pas le cas, c'est que tes champs ne sont pas en réalité séparés par un séparateur, mais au contraire c'est des champs de largeurs fixe.
Dans ce cas, c'est pas le split qu'il faut utiliser, il faut découper ta ligne à la main.
1ere valeur du caractère 0 au caractère x
2nd valeur du caractère x+1 au caractère y
3eme valeur de y+1 à z ........

C'est un peu le doute que j'avais eu au départ quand j'ai vu les données que tu as mis en exemple

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
tonbosto Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 20:00
voici un lien le fichier en question, tu dois avoir raison sur le champs de largeurs de fixe

http://tonbost.free.fr/croix2.txt
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
16 mars 2008 à 21:07
OK

Ton fichier cumule les 2 techniques. C'est un fichier à cahmps de taille fixe, mais aussi à champs séparés par un séparateur.

Mais ici le séparateur n'est pas l'espace comme tu l'a cru mais la tabulation (code ascii 9)

Donc si tu garde la technique du Split, il faut que tu fasse le split sur la caractère Tabulation et plus sur l'espace.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
16 mars 2008 à 21:17
Tant qu'à faire, je te donne le format du fichier
Par ligne :
- Champ1
- Tabulation
- Champ2
- Tabulation
- Champ3
- Saut de ligne
LA ligne est effectivement terminée seulement par le caractère Saut de ligne at non pas comme habituellement ar le couple Saut de ligne/Retour chariot

Pour chaque champ :
- signe (absent si positif)
- unité (absent si 0)
- séparateur décimal : le point
- décimales au nombre de 7
- caractère exposant
- signe de l'exposant
- 2 chiffres pour l'exposant
soit un total de 14 caractères par champs et 45 caractères par lignes

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
tonbosto Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 22:11
Merci beaucoup, je vais dépatouiller tout ça.  Je te tiens au courant.

A plus et encore merci
0
tonbosto Messages postés 7 Date d'inscription vendredi 14 mars 2008 Statut Membre Dernière intervention 16 mars 2008
16 mars 2008 à 23:13
Ca fonctionne, j'ai découper les lignes comme tu me l'as dis. J'ai utilisé la fonction Mid (string, start, longueur) pour ca. J'ai voulu utiliser les fonctions Right et Left, mais je sais pas pourquoi cela ne voulais pas.

Stock(0, 0) = Mid(ligne, 1, 14)
Stock(0, 1) = Mid(ligne, 16, 14)
Stock(0, 2) = Mid(ligne, 31, 14)

Voila, merci beaucoup encore une foi
0
Rejoignez-nous