Split d'un fichier lu ligne par ligne

yo612 Messages postés 16 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 19 juillet 2007 - 9 mars 2007 à 21:47
yo612 Messages postés 16 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 19 juillet 2007 - 11 mars 2007 à 12:15
Bonsoir,

Voilà j'ai presque fini mon soft, mais je rame depuis quelques temps avec la fonction split.
J'ouvre un fichier
je le split
je récupère chaque split
MAIS !!! Je n'ai que la première ligne du fichier. Les autres lignes du fichier ne s'affiche pas.
J'ai raté un For Each quelque part ou est-ce dans mon while not EOF qu'il faut que je rajoute qqchose ????
Un ptit coup de main SVP
Merci

Voici un extrait de mon code :
----------------------------------------------------------------------------
'ouvre le fichier source pour lecture
Open Filename For Input As #i
'lit toutes les lignes jusqu'à la fin du fichier
    While Not EOF(i)
        'met la première ligne lue dans la variable a
        Line Input #i, a
        checkdate = Left(a, 10)
        'vérifie si la première ligne contient une date, sinon saute l'entête du fichier
        If IsDate(checkdate) = True Then
            While Not EOF(i)
                Templire = Templire & a & crlf
                Line Input #i, a
                'compte le nombre de lignes lues
                CptLine = CptLine + 1
                tablo = Split(Templire, Chr(9))
            Wend
            lire = "D" & tablo(0) & crlf & "T" & tablo(2) & crlf & "M" & tablo(1) & crlf & "^" & crlf
            CptLine = CptLine + 1
            Unload Me
            MsgBox CptLine & " lignes converties", vbInformation, "Nombre de lignes"
        End If
    Wend
---------------------------------------------------------------------------

10 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
9 mars 2007 à 23:21
Split réinitialise le Tableau à chaque passage
C'est pratique pour séparer une chaîne en morceau, mais ça ne conserve pas les données précédentes.
Il faudrait que tu passes par un tableau dynamique si tu veux conserver tes données

De plus, pour vérifier ta date, tu pourrais le faire tout juste avant le premier While et éliminer le deuxième
'ouvre le fichier source pour lecture
Open Filename For Input As #i
'met la première ligne lue dans la variable a
Line Input #i, a
checkdate = Left(a, 10)
'vérifie si la première ligne contient une date, sinon saute l'entête du fichier
If IsDate(checkdate) = True Then
    While Not EOF(i)
    ......

Qu'est-ce que "lire" ?

MPi
0
yo612 Messages postés 16 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 19 juillet 2007
9 mars 2007 à 23:31
lire est une variable que j'affiche dans une textbox  et également me sert à enregistrer le  résultat dans un nouveau fichier avec print nouveaufichier, lire

Pour la vérification de la date, je pense pas pouvoir faire autrement car avant les données que je veux conserver et qui commence par une date, il y a une entête dans le fichier et qui est de longueur variable (en nombre de lignes, je parle)

Pour le tableau dynamique, je ne connais pas du tout.

je pensais mettre un for each qqchose
plus un i = i +1
mais je rame car je ne trouve pas d'expression exacte qui pourrait me convenir

Je suis sûr que l'on peut lire un fichier en entier et trouver les colonnes qui vont bien, comme quand on importe un fichier dans excel, mais je ne trouve pas la fonction ou les fonctions...
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
10 mars 2007 à 14:38
Tu dis que tu récupères chaque Split(), mais ce n'est pas le cas
            While Not EOF(i)
                Templire = Templire & a & crlf
                Line Input #i, a
                'compte le nombre de lignes lues
                CptLine = CptLine + 1
                'ici tablo contiendra bien les parties de Templire, en principe ...
                tablo = Split(Templire, Chr(9))
                'mais tu ne fais rien avec et tu reboucles
                'il faudrait peut-être que tu mettes cette ligne ici plutôt qu'après le Wend
                lire =  lire & "D" & tablo(0) & vbcrlf & "T" &
tablo(2) & vbcrlf & "M" & tablo(1) & vbcrlf & "^" &
vbcrlf
            Wend

Et tu devrais quand même enlever le premier While, je pense (j'avais dit le deuxième...)
Mais ne connaissant pas ton fichier et ne comprenant pas vraiment à quoi sert la condition de date... (?)
Est-ce que cette date est toujours sur la première ligne du fichier ? Peut-elle être sur une autre ligne et est-ce à partir de là que tu commences à lire le fichier ? Est-ce qu'il peut y avoir plusieurs dates dans le fichier ??? plusieurs inconnues, quoi...

MPi
0
yo612 Messages postés 16 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 19 juillet 2007
10 mars 2007 à 15:52
Bonjour,

Merci de ta réponse mais j'ai trouvé la boulette et m'a obligé à refaire le while not EOF
La date n'est jamais sur la première ligne (sauf cas particulier), il y a toujours un entête + vbcrlf + la date et les données + vbcrlf + date et données, etc...

J'ai gardé le premier while car il me sert à boucler jusqu'à trouver la ligne avec la date
le second while me permet de boucler sur le fichier à partir de la ligne ou il y a la date.

Voici mes modifs :

While Not EOF(i)
        'met la première ligne lue dans la variable a
        Line Input #i, a
        'Vérifie si la première ligne contient une date
        checkdate = Left(a, 10)
        If IsDate(checkdate) = True Then
            CptLine = 1
            While Not EOF(i)
                'transforme la ligne lue en tableau
                tablo = Split(a, Chr(9), 4)
                lire = lire & crlf & tablo(0) & crlf & tablo(1) & crlf & tablo(2) & crlf
                Line Input #i, a
                'compte le nombre de lignes lues
                CptLine = CptLine + 1
            Wend
    'transforme la dernière ligne lue en tableau
     tablo = Split(a, Chr(9), 4)
    lire = lire & crlf & tablo(0) & crlf & tablo(1) & crlf & tablo(2) & crlf
wend

Ce n'est qu'un extrait du code et peut-être j'ai oublié des copier-coller
Mais bon, chez mois maintenant ça marche.

Une ptiote question conne :
Dans un inputbox, si l'user clique sur annuler, l'aide m'indique que ca renvoie une chaîne de longueur nulle. Ah ! comment je fais pour le détecter ?

Merci
0

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

Posez votre question
yo612 Messages postés 16 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 19 juillet 2007
10 mars 2007 à 15:56
Ah j'ai oublié de coller un End If après le premier wend
et puis je crois voir des ptites erreurs, j'aurais du copier tout mon code mais à partir du second while not EOF, j'ai 3 pages de codes, donc....
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
10 mars 2007 à 20:57
Personnellement, je préfère utiliser Do Until plutôt que While. Ça permet de sortir avec un Exit Do

Donc, tu dois premièrement trouver une date et ensuite lire le reste du fichier.
Tu pourrais donc faire une première boucle pour trouver la date et sortir de cette boucle lorsque trouvée. Ensuite, tu démarres une seconde boucle pour la lecture du reste du fichier.

open Fichier.... as #i
Do Until EOF(i)
        'met la première ligne lue dans la variable a
        Line Input #i, a
        'Vérifie si la première ligne contient une date
        checkdate = Left(a, 10)
        If IsDate(checkdate) = True Then
       CptLine = 1  ' si tu commences le compteur ici ...
       Exit Do
Loop

 '2e boucle
Do Until EOF(i)
         Line Input #i, a
         tablo = Split(a, Chr(9), 4)
          'ici tu mets crlf que je ne connais pas (?) est-ce un saut de ligne ?
         lire = lire & vbCrLf & tablo(0) & vbCrLf & tablo(1) & vbCrLf & tablo(2) & vbCrLf
        CptLine = 1

Loop
close #i

MPi
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
10 mars 2007 à 21:01
Et pour ta question d'Inputbox

    Dim val As String
    val = InputBox("Entrer une valeur", "Mon prog", 3)
    If val = vbNullString Then
        MsgBox "L'utilisateur a annulé"
    End If

MPi
0
yo612 Messages postés 16 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 19 juillet 2007
11 mars 2007 à 00:47
Merci beaucoup pour le vbnullstring.
Des fois on cherche midi à 14 heures pendant des jours alors que la solution est toute simple. Heureusement qu'il y a des forums pour l'entraide.

Pour le crlf, c'est effectivement une variable qui vaut :
crlf = Chr$(13) + Chr$(10)
Je ne connaissais pas vbcrlf et donc ca m'évitait de me retaper à chaque fois les chr (xx)

Pour ta boucle, je n'ai pas testé mais si effectivement la première s'arrète dès qu'il a trouvé une date il passe à la deuxième boucle qui elle relit une ligne, donc ma première ligne passe aux oubliettes, non ?

le exit do obéit au if.. then précédent et passe au suivant do until eof ??? c'est bien ça ?
si oui effectivement c'est mieux que le while.
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
11 mars 2007 à 03:02
Le Exit Do permet de sortir du Do...While ou Do...Until

C'est donc dire que tu boucles jusqu'à ce qu'une condition soit vérifiée. Si, à ce moment tu n'as plus besoin de continuer la boucle tu mets Exit Do pour en sortir.
La même chose peut être affectée au For...Next avec Exit For

Très utile dans bien des cas, bien qu'on puisse utiliser d'autres méthodes...

MPi
0
yo612 Messages postés 16 Date d'inscription mercredi 21 février 2007 Statut Membre Dernière intervention 19 juillet 2007
11 mars 2007 à 12:15
super super sympa pour les newsbies comme moi qui démarre en prog.

Comme je fais tout à la force du poignet, pas de stage, pas de cours, juste des bouqins qui reste malgré tout très généraliste, je suis heureux de pouvoir trouver des gens comme vous qui donnent volontiers un petit coup de main aux débutants.

Merci encore.

Je reviendrais sûrement quand à nouveau je ramerai dur sur une prochaine ligne
0
Rejoignez-nous