Lecture de fichier texte.txt [Résolu]

Efferp 23 Messages postés jeudi 27 février 2014Date d'inscription 19 mai 2018 Dernière intervention - 3 mai 2018 à 21:50 - Dernière réponse : Efferp 23 Messages postés jeudi 27 février 2014Date d'inscription 19 mai 2018 Dernière intervention
- 10 mai 2018 à 17:53
Bonjour,

j'utilise ce bout de code pour lire un fichier texte.

Je remplis avec ma boucle une collection de string.

Le problème que je rencontre est avec les diacritiques, il me récupère des petits losanges avec un point d'interrogation :'(


Try
   Dim monStreamReader As New IO.StreamReader(FichierDeMot)
   Dim MotDeListeDeMot As String

   Do
     MotDeListeDeMot = monStreamReader.ReadLine
     ListeDeMot.Add(MotDeListeDeMot)
   Loop Until MotDeListeDeMot = "-" 'Boucle jusqu'au trait

   NombreDeMot = ListedeMot.Count - 1

   monStreamReader.Close()

   Catch ex As Exception
     MsgBox("Une erreur est survenue au cours de la lecture du fichier de mots.",vbCritical,"Erreur de lecture")
End Try


Merci pour votre aide passée / présente et future :)
Afficher la suite 

Votre réponse

8 réponses

Whismeril 11529 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 mai 2018 Dernière intervention - 3 mai 2018 à 22:51
0
Utile
Bonjour

les diacritiques dépendent de l'encodage du fichier: UTF7, UTF8, etc...

Dim monStreamReader As New IO.StreamReader(FichierDeMot, System.Text.Encoding.'ici mettre la constante du format qui va bien, commence par essayer Ascii

Commenter la réponse de Whismeril
Efferp 23 Messages postés jeudi 27 février 2014Date d'inscription 19 mai 2018 Dernière intervention - 3 mai 2018 à 23:58
0
Utile
Merci pour ta réponse rapide et efficace, j'ai testé avec

ASCII -> m'a récupéré des ? au lieu des losanges
UTF8 -> toujours mes losanges
default -> Impecc :)

Alors à quoi correspond default, je ne sais pas exactement mais faudra que je me penche dessus quand j'aurais un peu plus de connaissance.

Merci pour ton aide.
Commenter la réponse de Efferp
Whismeril 11529 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 mai 2018 Dernière intervention - 4 mai 2018 à 06:56
0
Utile
Ok, alors maintenant littéralement ça
NombreDeMot = ListedeMot.Count - 1
c’est faux, Count retourne le nombre d’enregistrements si tu as bien un mot par ligne alors Count - 1 sera le nombre de mots - 1. Si tu as besoin du nombre de mots - 1, c’est ok, mais la variable est mal nommée.

De plus, il y a peut être plus simple à coder. Le tiret sépare t il le fichier en 2 ou est ce la dernière ligne?
Commenter la réponse de Whismeril
Efferp 23 Messages postés jeudi 27 février 2014Date d'inscription 19 mai 2018 Dernière intervention - 4 mai 2018 à 22:45
0
Utile
Bonjour,

le tiret est la dernière ligne de mon fichier, c'est la méthode que j'ai trouvé pour arrêter la lecture du fichier.
Commenter la réponse de Efferp
Whismeril 11529 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 mai 2018 Dernière intervention - 5 mai 2018 à 00:03
0
Utile
La classe File permet des manipulations de fichiers, et entre autre, lecture / écriture sans passer par un stream.

File.ReadAllLines retourne un tableau ou chaque ligne du fichier est un item du tableau.
Vu que le tiret est ta dernière ligne, il suffit de dire que tu veux tout le tableau sauf la dernière ligne ou sauf "-"
Ensuite tu castes en liste.

Un truc comme ça (tapé de tête, y'a p'tet des petites boulettes)
Dim lignes as String()= File.ReadAllLines(FichierDeMot, Encoding.Default)
ListeDeMot = lignes.Take(lignes.Length-1).ToList()'je prends les N-1 premières lignes et j'en fait une liste


Ça t'évite d'ouvrir un stream, de faire ta boucle et de le fermer.


Sinon, pour atteindre la fin du fichier, il suffisait d'appliquer l'exemple qui est sur l'aide en ligne
https://msdn.microsoft.com/fr-fr/library/system.io.streamreader(v=vs.110).aspx
Boucle tant que la ligne vaut quelque chose.
Commenter la réponse de Whismeril
Efferp 23 Messages postés jeudi 27 février 2014Date d'inscription 19 mai 2018 Dernière intervention - 8 mai 2018 à 22:28
0
Utile
Bonjour/Bonsoir

me revoilà après quelques changements à mon code.
Voici la nouvelle version de lecture et de mise en collection de mon fichier txt.

Le problème et que même après une réinitialisation de la variable FichierDeMots, quand je reviens sur cette partie de mon code avec une nouvelle valeur de variable, il m'ouvre quand même l'ancienne version du fichier. Existe-t-il une option pour "décharger" ce fichier ?

		' Déclaration des variables / Lecture du fichier.txt
		Dim Lignes as String()= File.ReadAllLines("Listes\" & FichierDeMots & ".txt", System.Text.Encoding.UTF8)
		Dim i As Integer
		Dim NombreDeMots As Integer = Lignes.Length
		Dim IndexMot as Integer
		Dim random As New Random()
		' Mise en Collection
		For i = 0 To Lignes.Length - 1
			ListeDeMots.Add(Lignes(i))
		Next
Commenter la réponse de Efferp
vb95 1568 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 21 mai 2018 Dernière intervention - Modifié par vb95 le 9/05/2018 à 01:02
0
Utile
Bonjour !
A mon avis il ne t'ouvre pas l'ancienne version du fichier !
Il ajoute à l'ancienne version du version la nouvelle version : les lignes du nouveau fichier sont mises à la fin des lignes de l'ancien fichier pour reprendre ta terminologie .
il faut vider la collection avant d'ajouter les nouvelles lignes du nouveau fichier

' Déclaration des variables / Lecture du fichier.txt
  Dim Lignes as String()= File.ReadAllLines("Listes\" & FichierDeMots & ".txt", System.Text.Encoding.UTF8)
  Dim NombreDeMots As Integer = Lignes.Length
  Dim IndexMot as Integer
  Dim random As New Random()
  ListeDeMots.Clear() ' ligne à rajouter pour effacer la collection
  ' Mise en Collection
  For i = 0 To Lignes.Length - 1
   ListeDeMots.Add(Lignes(i))
  Next


ou alors tu reprends le code que Whismeril t'as donné ce qui évite la boucle For ainsi que le vidage de la collection

Commenter la réponse de vb95
Efferp 23 Messages postés jeudi 27 février 2014Date d'inscription 19 mai 2018 Dernière intervention - 10 mai 2018 à 17:53
0
Utile
Bonjour et merci.

Cela fonctionne très bien avec ton code en plus.
Commenter la réponse de Efferp

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.