Probleme de chaine en fin de fichier txt

[Résolu]
Signaler
Messages postés
70
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
7 juillet 2009
-
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
-
hello bonne soirée
un peu bloqué depuis ce matin
je traite un projet meteo :
analyse de champs dans un fichier txt
par ex a url :
http://weather.noaa.gov/pub/data/observations/metar/stations/AAXX.TXT

tout se passe bien mais j ai un ennui en fin de fichier:
le dernier champ de 5  caracteres qui commence par Q----
n est pas traité  en fait il en fait 6 si j en juge le len(champ)..
j ai essayé de le trimer et autres manoeuvres sns succes..
je soupsonne un car caché ( fin de fichier et autre)
mais meme en rabotant la fin rien n'y fait ..
une idée ??
merci

10 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Re
Ok, ton code est correct, bien conçu.
Ce qu'il faut que tu saches maintenant, c'est "quel est le caractère intrus ?"
Pour ce faire, une simple boucle :
   For r = 1 To Len(Field)
      Debug.Print r, Asc(Mid$(Field, r, 1))
   Next r
et tu retrouveras la liste des caractères dans ta fenêtre de debug (Ctrl-G)
En consultant une table des codes ASCII (dans l'aide de VB), tu retrouveras facilement le caractère qui s'est invité.
A mon avis, ce doit être un caractère dit "non imprimable", genre 0, 9, 10, 13
Ensuite, tu n'auras qu'à les éradiquer avec un simple Replace

Ce n'est pas lié à ton problème mais, méfie toi, n'utilise jamais de nom de variable pouvant ressember à des mots clés du langage, comme Field : cela peut donner des résultats bizarre.
Pour palier à ça, il y a des règles faciles à appliquer, sorte d'hygiène du code : Faire précéder chacune de tes variables par une lettre désignant son type, exemple :
   Dim sField As String
   Dim lLongueur As Long
   Dim aMonTableau() As String  (a comme Array)  etc ...
Avantages :
- tu ne pourras jamais tomber sur un mot clé
- au moment de l'écriture, il te suffit de taper 's' puis Ctrl-Espace pour connaitre la liste de tes variables chaine (s comme string)
- tu ne te tromperas plus sur le type de variable

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
Salut

Il fait 6 caracteres ??

Q10009
123456

Comment tu lis ton fichier
Messages postés
70
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
7 juillet 2009

hello nhervagault
eh bien non.....
c'est qd meme pas ca,  meme si tu as raison par un etraordinaire concours
de circonstances
ce champ doit faire 5 caracteres
Q + la pression en mbars ou hpascals
c'est toujours dans les 1000 mais la,  il y avait un vrai bug extraordinaire
pas de chance

considere le site
http://weather.noaa.gov/pub/data/observations/metar/stations/
choisit un terrain et tu verras
donc le pb reste  entier pour moi

ca le fait aussi si le dernier champ est 'NOSIG'

bsr
Messages postés
6063
Date d'inscription
dimanche 13 avril 2003
Statut
Modérateur
Dernière intervention
15 juillet 2011
36
Quelle est ta methode de lecture?

Avoir ce resultat
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Salut
Oui, comme le dit nhervagault, c'est surement un problème de programme.
Sans plus de détail, impossible de te dire où ça coince.

Les fichiers étant très simples, et la ligne à lire étant formatée par des espaces, la méthode serait elle aussi simple :
Exemple :

   Dim sTemp As String
   Dim aValeurs() As String
   Open ...
   Line Input #1, sTemp As String   ' 1ere ligne
   Line Input #1, sTemp As String   ' 2eme ligne
   aValeurs = Split(sTemp, " ")
   Close ..
Tu auras ainsi chaque item de la ligne dans une des variables du tableau aValeurs(x) avec x :
2007/06/14 12:00
CMSC 141200Z AUTO 04007KT 15/10 RMK AO1 T01500103
  0     1     2      3      4    5   6      7 

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
70
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
7 juillet 2009

bonsoir
En fait c'est ce que je fait
je lis en http le fichier sur le net
en creant un fichier txt
je le splitte avec separateur 'espace' en chargeant un tableau
puis je relis les cases une par une et je traite
ca le fait tjrs avec le dernier champ , meme quand celui ci est 'nosig'

j ai essayé de le 'raboter'
jusqu'a ce qu'il entame le champ
ex
 buffer2 = Left(buffer2, Len(buffer2) - 1)
mais peut etre faut il au contraire le rallonger ??
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Re
Même réaction : C'est dans ton code que ça déconne : tant qu'on n'aura pas vu ... (ne colle que l'essenciel)
A mon avis, ce n'est pas normal de rater la fin si tu lis bien toute la ligne : j'en doute
Tu dois avoir dimensionné la longueur à lire quelque part ...
Messages postés
70
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
7 juillet 2009

SOS SOS
Desolé pour le retard
voila le code de la lecture
je reprecise le dernier champ splité  fait 6 caracteres alors qu'il en fait en fait 5
J ai raccourci le code et mis en ' les trucs inutiles
le fichier est recupere sur les url dans les msg precedents
j ai mis entre deux lignes de == les controles du champ
merci
*************************************************
Private Sub LireMetar()            ' Lecture Metar ,   le splitter , charger un tableau
    Dim filecode1 As Integer       ' No de fichier pour freefile
    Dim buffer2 As String          ' Buffer lecture
    Dim MetarData As String        ' Nom du fixchier
    Dim field As String
    'Dim tablometar() As String    ' remis en tete
 '-----------------------------------------
    filecode1 = FreeFile()
    MetarData = App.path & "" & "metar.txt"
    Open MetarData For Input As filecode1         'Do Until EOF(1)
        Line Input #filecode1, buffer2            ' Là  on recupere tout le fichier
        'Me.Combo3.AddItem buffer2                ' On charge le combobox caché avec les champs metar
        If Left$(buffer2, 1) <> "<" Then          ' le metar est bon
         FlagNometar = False
         ' Text1.Text = buffer2                      ' On charge le text1.text
          TabloMetar() = Split(buffer2, " ")        ' On splite la ligne avec le separateur'          field TabloMetar(UBound(TabloMetar))
          Text3.Text = Len(field)
'==========================================================================
         Else   ' le   metar est un 404
          FlagNometar = True
          Text1.Text = " Pas de METAR pour ce terrain "
        End If
    Close #filecode1
    'If FlagNometar = False Then  'si le metar est un metar
      'buffer2 = Right(buffer2, Len(buffer2) - 16)    ' on ote la date
     ' buffer2 = Left(buffer2, Len(buffer2) - 1)     ' buffer2 buffer2 & " "
     ' Text1.Text = buffer2
   'Call Convert
   'End If
End Sub
Messages postés
70
Date d'inscription
mercredi 30 avril 2003
Statut
Membre
Dernière intervention
7 juillet 2009

hello jack
 c'est bien ca , j'aurais du y penser ...
je fais desormais:

If Right$(field, 1) = Chr(10) Then
          field = Left(field, 5)
End If

merci a*+
jm
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
80
Non, le 5 ne doit pas être fixe, un jour tu auras une donnée plus longue et ça ne collera plus.
   Field = Replace(Field, Chr$(10), "")

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)