Probleme de chaine en fin de fichier txt

Résolu
cs_zapad Messages postés 70 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 7 juillet 2009 - 9 déc. 2008 à 18:38
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 13 déc. 2008 à 16:55
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

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
12 déc. 2008 à 00:09
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)
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
9 déc. 2008 à 18:54
Salut

Il fait 6 caracteres ??

Q10009
123456

Comment tu lis ton fichier
0
cs_zapad Messages postés 70 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 7 juillet 2009
9 déc. 2008 à 19:22
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
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
9 déc. 2008 à 19:32
Quelle est ta methode de lecture?

Avoir ce resultat
0

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

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 déc. 2008 à 19:47
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)
0
cs_zapad Messages postés 70 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 7 juillet 2009
9 déc. 2008 à 19:54
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 ??
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
9 déc. 2008 à 23:16
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 ...
0
cs_zapad Messages postés 70 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 7 juillet 2009
11 déc. 2008 à 20:11
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
0
cs_zapad Messages postés 70 Date d'inscription mercredi 30 avril 2003 Statut Membre Dernière intervention 7 juillet 2009
12 déc. 2008 à 19:21
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 déc. 2008 à 16:55
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)
0
Rejoignez-nous