Récuperer des variable dans un fichier .txt

Messages postés
22
Date d'inscription
mercredi 19 septembre 2012
Dernière intervention
29 mars 2016
- - Dernière réponse : vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
- 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
Afficher la suite 

Votre réponse

9 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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 ....
Commenter la réponse de ucfoutu
Messages postés
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
22
Date d'inscription
mercredi 19 septembre 2012
Dernière intervention
29 mars 2016
0
Merci
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
vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
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
Commenter la réponse de cs_manlaurent
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
22
Date d'inscription
mercredi 19 septembre 2012
Dernière intervention
29 mars 2016
0
Merci
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
vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
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 ?
Commenter la réponse de cs_manlaurent
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
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 =
Whismeril
Messages postés
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
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?
vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
> Whismeril
Messages postés
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
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
Commenter la réponse de ucfoutu
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
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.
Commenter la réponse de ucfoutu
Messages postés
22
Date d'inscription
mercredi 19 septembre 2012
Dernière intervention
29 mars 2016
0
Merci
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
vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
> Whismeril
Messages postés
12415
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
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
cs_manlaurent
Messages postés
22
Date d'inscription
mercredi 19 septembre 2012
Dernière intervention
29 mars 2016
> vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
-
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
vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
> cs_manlaurent
Messages postés
22
Date d'inscription
mercredi 19 septembre 2012
Dernière intervention
29 mars 2016
-
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 .....)
cs_manlaurent
Messages postés
22
Date d'inscription
mercredi 19 septembre 2012
Dernière intervention
29 mars 2016
-
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
vb95
Messages postés
1734
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
18 décembre 2018
> cs_manlaurent
Messages postés
22
Date d'inscription
mercredi 19 septembre 2012
Dernière intervention
29 mars 2016
-
On te dit ce qu'il faut faire !
qu'attends-tu alors ?
Whismeril t'as fourni le code pour la list of ! au boulot alors !
Commenter la réponse de cs_manlaurent

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.