Récuperer des variable dans un fichier .txt

cs_manlaurent Messages postés 22 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 29 mars 2016 - 25 mars 2016 à 00:01
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 29 mars 2016 à 15:00
Bonsoir,
Après plusieurs heures de recherche sur le net, je viens vers vous pour de l'aide. Je dois récupérer dans un fichier .txt plusieurs variables comme par exemple REC5000 = 0.02
REC5001 = 0.05
REC5009 = 0.01
etc.. , a savoir que la valeur affecté n'est jamais la même. Ensuite les récrire dans un autre fichier

Pour lire et réécrire le fichier .txt il y a pas de problème avec la méthode StreamReader et StreamWriter

Dim file As New System.IO.StreamReader("Monchemin")
Dim words As String = file.ReadToEnd()
file.Close()
Mon problème est que je sais pas comment m'y prendre pour récupérer ces variables a l’intérieur du fichier .txt, je n'est pas trouvé un exemple sur le net pour me guider.

Merci

Bonne soirée


Laurent

9 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 mars 2016 à 03:46
Bonjour,
Il sera bon que tu sois très précis en ce qui concerne les chaînes à extraire. Tes "par exemple" ne permettent pas de déterminer avec CERTITUDE si TOUTES les chaînes concernées commencent TOUJOURS par "REC" suivi de 4 chiffres, puis d'un " = " suivi d'une chaîne de format "#.##" ...
La structure de ton fichier a également son importance. Ces chaînes sont-elles "fondues" dans du texte sur des lignes ou constituent-elles, chacune, une ligne entière, etc ....
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
25 mars 2016 à 07:16
Bonjour

à l'instar d'Uc que je salue, sache que si ton fichier n'est pas rigoureusement ce que ton exemple montre, alors ma réponse ne sera pas entièrement valable.

Dans un premier temps, pour lire un fichier texte entièrement d'un coup, il est plus simple d'utiliser la classe File
Dim word As String = File.ReadAllText("MonFichier.txt")


Cependant dans ce cas (comme avec le streamreader) il te faudra ensuite séparer les lignes, or ton exemple montre une information par ligne, il serait donc plus simple de récupérer directement une collection contenant chaque ligne (un tableau par exemple)
Dim word As String() = File.ReadAllLines("MonFichier.txt")



Cela fait, il faut stocker tes données dans une variable (ou plutôt une collection de variables: une par ligne) facilement utilisable.
On va dire que la première partie est un nom et que la seconde est une valeur, le nom est un string (en supposant que tu ne veux pas récupérer le numéro) et la valeur un double.

On va donc écrire une classe comme ça
Public Class TestManLaurent

    Public Property Valeur() As Double

    Public Property Nom() As String
End Class


Maintenant il va falloir initialiser une instance de cette classe pour chaque ligne, on va donc ajouter un constructeur à la classe qui prendra une ligne (donc un String) en paramètre.

Pour découper la ligne, je suppose que le format est celui décrit par UC, des caractères, un séparateur " = " et un nombre. Quand il y a un séparateur précis, on peut utiliser String.Split()
Public Class TestManLaurent
    Public Sub New(Ligne As String)
        Dim colonnes As String() = Ligne.Split({" = "}, StringSplitOptions.None)
        Nom = colonnes(0)
        Valeur = Convert.ToDouble(colonnes(1))
    End Sub

    Public Property Valeur() As Double

    Public Property Nom() As String
End Class


Il reste a lire la collection de lignes pour en faire une collection de TestManLaurent
        Dim lignes As String() = File.ReadAllLines("MonFichier.txt")
        Dim mesTestManLaurent As List(Of TestManLaurent) = New List(Of TestManLaurent)

        For Each ligne As String In lignes
            mesTestManLaurent.Add(New TestManLaurent(ligne))
        Next
0
cs_manlaurent Messages postés 22 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 29 mars 2016
28 mars 2016 à 12:36
Bonjour a tous,

il est vrais que j'ai pas trop bien expliquer mon problème, voilà le contenue de mon fichier texte:

"9000" = 0.010
"7000" = 0.015
"9002" = -0.080
"3050" = 0.042
"3000" = 0.000
"5000" = 0.100
"9003" = -0.052
"8045" = 0.033
"6010" = -0.010
etc.....
ce sont des chiffres toujours en colonne et avec (" "), j'avais mentionner au début avec (REC) parce que je peux configurer la sortie de ces chiffres avec des lettres ou pas, en pensons que ça aurais étais plus facile a extraire dans une variable.Il peut y avoir jusqu’à 40 a 50 lignes, et mon problème est d'avoir par exemple sur la 1er ligne: 9000 = 0.010 sans les ("")et cela dans une variable ou je puisse les utiliser par la suite.

Merci Beaucoup

Manlaurent
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
28 mars 2016 à 14:13
Bonjour à tous ( et amitiés à Whismeril et Ucfoutu)

Pour cs_manlaurent
Tu dis :"mon problème est d'avoir par exemple sur la 1er ligne: 9000 = 0.010 sans les ("")et cela dans une variable ou je puisse les utiliser par la suite"
Cette variable serait alors obligatoirement une variable String ( chaine de caractères)
A quoi correspond 9000 et 0.010 ? ( 9000 le numéro d'un appareil et 0.010 sa valeur par exemple )
Le début de ta chaine "9000" comporte-t-il toujours 4 chiffres ?
Y a-t-il toujours 2 espaces de chaque côté du signe = ?
Ce qui suit le signe = est-il toujours une valeur numérique ?

ton plus gros problème est d'exposer clairement ce que tu envisages ( un coucou à la signature de ucfoutu en prime)

Réponds clairement à ces questions et on pourra voir comment t'aiguiller vers une solution : ton problème fait partie du B.A.B.A en programmation
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 28/03/2016 à 12:48
Ah ... v'la que cela change ...
Et :
etc.. , a savoir que la valeur affecté n'est jamais la même. Ensuite les récrire dans un autre fichier

signifie alors quoi, EXACTEMENT ?
Comment veux-tu (montre-nous) que soit écrit ton "autre fichier" ?

Lis donc, au passage, le texte de ma signature ....
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0

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

Posez votre question
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
Modifié par Whismeril le 28/03/2016 à 13:21
Bonjour

alors, comme le souligne Uc, cela manque encore de précision sur la sortie, mais sur l'entrée aussi.

Option 1

Quelque soit le texte "Nom", c'est le texte dont tu as besoin et ma solution est valable.

Otption 2

Tu es en mesure de figer le format et personne n'y touchera plus, et c'est le numéro que tu veux récupérer, alors il suffit d'utiliser Replace pour enlever ce qui est en trop, on peut même convertir si on le veut en tant qu'entier
        Dim test As String = "REC0001".Replace("REC", String.Empty)'test vaut "0001"
        Dim test2 As String = """0002""".Replace("""", String.Empty)'teste vaut "0002"
        Dim test3 As Integer = Convert.ToInt32(test2)'test3 vaut 2

Option 3

Tu ne peux pas être sur que le format ne bougera jamais, mais tu sais dans quelle mesure il peut évoluer => Regex

Option 4

autre, détails?


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
cs_manlaurent Messages postés 22 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 29 mars 2016
28 mars 2016 à 17:40
c'est une machine a mesurer en 3D avec un stylet et une bille au bout. on vient mesurer des trous des surfaces plane des rayons etc..par palpage. Le "9000" est le n° d'export et = 0.010 est la valeur a corriger. Ces n° d'export en principe on 4 chiffres ou 5 chiffres. Ces chiffres c'est moi qui les définit au départ dans le paramétrage de la machine a mesurer. Ce 1er fichier avec toute ces valeurs je dois pas y toucher, mon but est de reprendre les n° d'exports avec les valeurs a corriger de les remplacer les anciennes valeurs dans un 2eme fichier également en format .txt. Ce fichier sera renvoyé par la suite dans une autre machine qui vas reprendre les valeurs et faire les corrections demandé. (c’est compliqué je sais). Je peux pas utiliser le "9000" qui est pas compatible entre eux, je dois le changer en :
L100 = 0.010
L101 = 0.015
L102 = -0.080
L103 = 0.042
L104 = 0.000
etc...
Je dois faire correspondre un paramètre (Lxxx) quelque chose a un n° d'export bien défini.
L100 correspond au 9000
L101 correspond au 7000
L102 correspond au 9002

Dans mon idée il était de travailler avec des variables, mais c'est pas obliger bien sure. Je suis de loin un expert en vb comme vous l'auriez remarqué. Cette machine a mesurer tourne avec une petite interface réaliser par moi même en vb.net et avec pas mal d'aide de votre part.

Manlaurent
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
28 mars 2016 à 18:09
Bonsoir
donc tu as un fichier avec "9000" = 0.010 etc......
Le nombre entre guillemets est de 4 ou 5 chiffres
ensuite une valeur après le signe =

Appelons ce fichier FichierExport

si j'ai bien compris il faut que tu crées un second fichier qui contient L100 = 0.010 etc......

Le L100 est pour faire correspondre le 9000 et 0.010 est la valeur issue du premier fichier
Comment tu définis le paramètre L100 ? est-ce une suite L100, L101, L102 etc... ?
L100 correspond à la première ligne . L101 correspond toujours à la seconde ligne et ainsi de suite ?
Dois-tu impérativement garder le fichier d'origine tel quel ( le fichier FichierExport) et créer un second fichier ?
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 28/03/2016 à 18:19
Ouais ...
Il semble au bout du compte que tu veux tout simplement utiliser un fichier texte en lieu et place d'une base de données.
Je te suggère alors de t'intéresser de près à ce que sont les fichiers texte structurés, avec une structure composée de deux membres :
- un membre numero_export, de type string
- un membre valeur, de type numérique
Ni les guillemets, ni tes signes "= " n'auraient alors rien à faire dans un tel fichier, dont chaque enregistrement est précisément composé de de deux données correspondant aux deux membres de la structure.
commence donc par la lecture de la discussion suivante, qui devrait déjà commencer à t'éclairer :
http://codes-sources.commentcamarche.net/forum/affich-1484155-ajout-structure-dans-un-fichier-txt-en-vb
Pour la suite (l'extraction de la valeur correspondant à un numero, etc ...), je ne doute pas que vb.net t'offre certaines facilités, que je ne connais pas personnellement. Je ne serais toutefois pas surpris que Whismeril te suggère de compléter tout cela par l'utilisation d'une listof

EDIT : je te suggère également la lecture, dans la foulée, de :
https://msdn.microsoft.com/en-us/library/w2hew2sw%28v=vs.110%29.aspx

________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 28/03/2016 à 18:23
Exact ucfoutu
un list of avec une structure contenant ces 2 paramètres
Salut à toi mon cher

Par contre si le fichier texte lui sert pour son interface pourquoi ne pas remplacer "9000" = 0.010 directement par L100 = 0.010 ?
On remplace juste la chaine avant le signe =
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
Modifié par Whismeril le 28/03/2016 à 18:46
je ne serais toutefois pas surpris que Whismeril te suggère de compléter tout cela par l'utilisation d'une listof

Et comment!

j'attends cependant de savoir comment "notre" programme est sensé savoir que
L100 correspond au 9000
L101 correspond au 7000
L102 correspond au 9002


Car
Je dois faire correspondre un paramètre (Lxxx) quelque chose a un n° d'export bien défini.

Ok mais ou est ce définit?
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024
Modifié par vb95 le 28/03/2016 à 18:59
Salut Whis
nous sommes 3 sur la discussion avec notre ami Ucfoutu et ce qui est formidable c'est que l'on pose tous les mêmes questions sous des formes différentes !
comme quoi poser les bases et l'algorithme est primordial
"Wait and See" diraient nos amis britanniques
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 mars 2016 à 19:44
Et plus je relis tout cela, plus je pense qu'un seul fichier suffirait, au lieu de deux (un pour les valeurs originelles et l'autre pour les valeurs "corrigées"). Une structure de 3 membres (numero_export, valeur_orig, valeur_rectifiee) devrait faire l'affaire.
0
cs_manlaurent Messages postés 22 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 29 mars 2016
29 mars 2016 à 10:34
Bonjour,

alors j'ai pris la remarque de VB95 pourquoi ne pas remplacer "9000" = 0.010 directement par L100 = 0.010 qui a tout a fait raison, je me complique vraiment. Du coup voici mon fichier d'export en .txt
"L100=" 0.010
"L101=" 0.015
"L102=" -0.080
"L103=" 0.042
"L104=" 0.000
etc..
y as t'il moyen simple de remplacer ces valeurs sans les ("") et les espaces dans mon 2eme fichier qui comporte exactement les mêmes nb de lignes ?. Ce 2eme fichier est obligatoire pour moi ou il contient aussi divers calcul de formule etc.. Il y a un 2eme fichier stocké sur mon disque dur pour chaque mesure
Dois-je reprendre l'exemple de Whismeril avec le tableau ?
merci

Bonne journée
0
Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024 656
29 mars 2016 à 11:05
Bonjour, pour remplacer les guillemets par rien, je t'ai montré comment faire plus haut http://codes-sources.commentcamarche.net/forum/affich-10062432-recuperer-des-variable-dans-un-fichier-txt#5 Option 2

Tu peux meme le faire d'un coup sur tout le fichier, avec file.readalltext, remplacement et file.writealltext
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Whismeril Messages postés 19024 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 18 avril 2024
Modifié par vb95 le 29/03/2016 à 13:08
Bonjour à tous

Dans ton nouveau fichier export le second guillemet devrait être avant le signe = mais on chipote un peu
"L100=" 0.010
"L101=" 0.015
"L102=" -0.080
"L103=" 0.042
"L104=" 0.000

Maintenant tu as toutes les "armes" pour accomplir la tâche demandée !

Par contre tu peux expliquer là ?
y as t'il moyen simple de remplacer ces valeurs sans les ("") et les espaces dans mon 2eme fichier qui comporte exactement les mêmes nb de lignes ?. Ce 2eme fichier est obligatoire pour moi ou il contient aussi divers calcul de formule etc.. Il y a un 2eme fichier stocké sur mon disque dur pour chaque mesure
0
cs_manlaurent Messages postés 22 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 29 mars 2016 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
29 mars 2016 à 14:15
Bonjour VB95,
pas facile pour moi a expliquer par écrit, je dois récupérer dans un premier temps le1er fichier d'export avec les "Lxxx=" avec valeur sans les ("") et sans les espaces et de le réécrire dans un 2ème fichier qui es sur mon disque qui contient les même Lxxx mais avec des valeurs différentes. ou j'écrase uniquement les valeurs ou toute la ligne.
A savoir aussi que ces 2 fichiers contiennent d'autre valeurs écrite avant et après la série de Lxxx,
Si je résume la machine mesure, je récupère uniquement les "L100=" 0.010, j'élimine les "" et espace, et je viens écraser UNIQUEMENT la ligne ou la valeur sur mon 2eme fichier.
Mon souci est de récupérer seulement la série de Lxxx
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > cs_manlaurent Messages postés 22 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 29 mars 2016
29 mars 2016 à 14:30
Salut cs_manlaurent
Résumons car on commence à comprendre
La machine mesure et te donne un fichier

"9000" = 0.010
"7000" = 0.015
"9002" = -0.080
"3050" = 0.042
"3000" = 0.000
"5000" = 0.100
"9003" = -0.052
"8045" = 0.033
"6010" = -0.010

Dans un second fichier il faut chercher les L100, L101 etc ..... et remplacer la valeur qui les suit par la valeur qui suit "9000", "7000", etc.....
Mais ce second fichier comporte des informations supplémentaires ce qui fait que qu'on ne peut pas remplacer le second fichier par le premier

une list of avec une structure à 3 éléments( "9000" , 0.010 et L100 pour les 3 éléments du premier objet de la liste)

ensuite dans le second fichier texte en boucle tu recherches les L100, L101 , etc ..... et tu remplaces ce qui les suit par les nouvelles valeurs ( le 0.010 du premier objet pour L100 , etc .....)
0
cs_manlaurent Messages postés 22 Date d'inscription mercredi 19 septembre 2012 Statut Membre Dernière intervention 29 mars 2016
29 mars 2016 à 14:52
oui exactement ca , le 1er fichier aussi comporte d'autre informations.
Et comme tu as dit hier je peux aussi remplacer ces 9000, 7000, directement avec les L100, L101, etc. comme ca j'aurai qu'a changer la valeur
0
Rejoignez-nous