[VBA] lire fichier texte jusqu'à ...

lire fichier texte jusqu'à ... [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 17-03-2010 à 12:53:45    

Bonjour à tous,
 
Je débute en VBA et j'aurais besoin d'un petit coup de main svp... Mon objectif est de créer une macro permettant de transformer un fichier texte contenant des coordonnées de points (x,y) en un fichier python directement codé pour créer ces points dans un logiciel de simulation numérique.  
 
En gros le fichier est comme ci-dessous :
 

Citation :


0.00 -791.0  
5.98 -791.0  
11.95 -791.1  
17.93 -791.1  
23.90 -791.2  
29.88 -791.2  
etc...


 
Que je voudrais transformer en :
 

Citation :


s.Line(point1=(0.00,-791.0),point2=(5.98,-791.0))
s.Line(point1=(5.98,-791.0),point2=(11.95,-791.0))
s.Line(point1=(11.95,-791.1),point2=(17.93,-791.1))
s.Line(point1=(17.93,-791.1),point2=(23.90,-791.1))
s.Line(point1=(23.90,-791.2),point2=(29.88,-791.2))


 
 
 
Donc j'ai déjà ecrit pas mal de trucs : comment demander l'adresse du fichier à l'utilisateur, puis ouvrir ce fichier, lire des données dedans, les écrire dans un nouveau fichier,etc.. en voici un extrait ci dessous :
 
 

Citation :


'Creation d'un fichier python
Open "python.py" For Output As #2
 
' Ouverture du fichier texte
Open Nom_Fichier For Input As 1
 
 
While Not EOF(1)
Line Input #1, strLigne
Print #2, strLigne
Wend
 
Close 1
 
Close #2


 
Je voudrais juste savoir comment programmer en VBA une lecture jusqu'à un espace (pour la première coordonnée) et jusqu'à un retour à la ligne (pour la seconde) ?
 
Merci d'avance pour votre aide

Reply

Marsh Posté le 17-03-2010 à 12:53:45   

Reply

Marsh Posté le 18-03-2010 à 08:05:17    

bonjour,
Utilise split  
 

Code :
  1. Open Nom_Fichier For Input As #1
  2. While Not EOF(1)
  3. Line Input #1, strLigne
  4. Tablo = Split(strLigne)
  5. Debug.Print Tablo(0)
  6. Debug.Print Tablo(1)
  7. Wend


A+

Reply

Marsh Posté le 18-03-2010 à 09:57:11    

Bonjour,  
 
merci pour le conseil. Je dois le mettre tel quel car ca ne fonctionne pas (désolé je débute en VBA). Est ce que je dois déclarer le tableau avant ? Les ligne debug.print servent à quoi ?
 
Sinon il n'existe vraiment aucun moyen de lire jusqu'à blanc ou retour a la ligen ? car si j'ai des tableau différents (avec 3 cordonoées apr exemple, et que je n'en souhaite que 2) je ne sais pas si cette méthode fonctionnera encore...

Reply

Marsh Posté le 18-03-2010 à 13:01:44    

bonjour,
Euh, c'était juste l'idée... J'ai repris tes données dans un "FichierA.txt"
J'ai repris ta macro, mais au lieu de vider les données dans un fichier cible, je les dirige vers la fenêtre d'exécution d'Excel pour te montrer comment utiliser le contenu de Tablo.
http://pagesperso-orange.fr/galopin01/images/split1.jpg
Peu importe le nombre d'éléments par ligne tablo(0) et Tablo(1) ne renverront que les deux premiers.
On pourrait aussi bien utiser des MsgBox pour les afficher, ou les réinsérer tel quel dans le fichier cible.
Mais tu devras d'abord bricoler tes string auparavant... les concaténer dans une autre variable que tu n'enverras que tous les deux tours...
Sur ce bricolage je te laisse te débrouiller avec tes boucles...
 
Pour la route je te donne le code de ma macro test qui fonctionne de la même manière :
 
Sub test()
'Creation d'un fichier cible
Open "FichB.txt" For Output As #2
' Ouverture du fichier texte
Open "FichA.txt" For Input As #1
While Not EOF(1)
Line Input #1, strLigne
Tablo = Split(strLigne)
Print #2, Tablo(0)
Print #2, Tablo(1)
Wend
Close #1
Close #2
End Sub
 
Les déclarations de variables ? ...C'est très tendance !
 
A+


Message édité par galopin01 le 18-03-2010 à 13:03:03
Reply

Marsh Posté le 18-03-2010 à 13:39:00    

Merci beaucoup pour ton aide, je vais essayer de bricoler quelquechose avec ca ;)
 
en attendant si quelqu'un a une idée pour "lire jusqu'a" (si ca existe) n'hesitez pas !
 

Reply

Marsh Posté le 18-03-2010 à 13:48:14    

Si je ne met que Print #2, Tablo(0)  cela fonctionne (ca me copie toute laligne) mais si je met :
 
While Not EOF(1)
    Line Input #1, strLigne
    Tablo = Split(strLigne)
    Print #2, Tablo(0)
    Print #2, Tablo(1)
Wend
 
J'ai une erreur9 sur le deuxieme print...


Message édité par cerber36 le 18-03-2010 à 13:48:45
Reply

Marsh Posté le 18-03-2010 à 14:10:09    

Mouai... Ben ça mon pote c'est juste que ton fichier texte n'a qu'un lointain rapport avec ça :
0.00 -791.0  
5.98 -791.0  
11.95 -791.1  
17.93 -791.1  
23.90 -791.2  
29.88 -791.2
Y sort d'ou ce fichier ? à mon avis le séparateur n'est pas un espace mais un caractère invisible (160) ou autre...
split  "lit jusqu'au" premier espace :
Si Tablo(0) te renvoie toute la ligne c'est qu'il n'y a pas d'espace... CQFD !
De même Tablo(1) ne peut pas te renvoyer ce qu'il y a après le premier espace puisqu'il n'y en a pas (...)  
On peut utiliser split en spécifiant un autre séparateur à condition de connaître son N° ASCI
Tu voudrais pas m'en mettre un petit bout en MP de ton fichier ? pour que je le confesse...
A+

Reply

Marsh Posté le 18-03-2010 à 14:52:57    

Ah excuse moi, en fait c'est que je test mon "programme" avec un juste un peu plus compliqué, comme expliqué dans mons econd poste, ou je parlais de possible fichier avec trois coordonnées. Voila mon fichier texte exact :
 
0.00 0 -791.0
5.98 0 -791.0
11.95 0 -791.1
17.93 0 -791.1
 
D'après ce que tu me dis, je trouve tout de même bisard qu'il me renvoit toute la ligne... Je continue a creuser de mon coté !

Reply

Marsh Posté le 18-03-2010 à 15:35:27    

split  "lit jusqu'au" premier espace :  
 
Si Tablo(0) te renvoie toute la ligne c'est qu'il n'y a pas d'espace... mais un caractère invisible (160) ou autre...
A+
 

Reply

Marsh Posté le 18-03-2010 à 16:46:56    

et dans le cas d'un caractère invisible que conseillerais tu ?  
 
C'est en effet peut etre cela le problème car à la base mon fichier est un fichier .prn et il y a entre chaque donnée un "bloque espace" (je ne sais pas trop ce que c'est mais quand je double click dessus ca me surligne un bloque). Puis quand je transforme ce fichier en .txt (que j'ouvre donc avec la macro d'excel) ce bloque est remplacé par des espaces...

Reply

Marsh Posté le 18-03-2010 à 16:46:56   

Reply

Marsh Posté le 18-03-2010 à 18:45:13    

cerber36 a écrit :

et dans le cas d'un caractère invisible que conseillerais tu ?  
 
C'est en effet peut etre cela le problème car à la base mon fichier est un fichier .prn et il y a entre chaque donnée un "bloque espace" (je ne sais pas trop ce que c'est mais quand je double click dessus ca me surligne un bloque). Puis quand je transforme ce fichier en .txt (que j'ouvre donc avec la macro d'excel) ce bloque est remplacé par des espaces...


 
Mettre un petit bout de ton fichier en MP... ou le uploader sur cjoint et nous donner l'adresse pour le télécharger.
 
On peut identifier ce caractère avec la méthode Open et décortiquer ta variable strLigne caractère par caractère, mais pour l'instant je suis un peu débordé pour te pondre un code.
 
On peut aussi identifier plus rapidement ce caractère en ouvrant directement le fichier dans Excel et en faisant un copier/coller du caractère dans cette formule entre les guillemets :
 
=CODE("_" )
 
A+

Message cité 1 fois
Message édité par galopin01 le 18-03-2010 à 18:58:30
Reply

Marsh Posté le 18-03-2010 à 19:25:29    

Salut,
 
tu peux essayer ça :
 

Code :
  1. separateur = " "  ' Si le séparateur n'est pas un caractère "espace", tu dois mettre la bonne valeur ici
  2. pos_separateur = InStr(1, strLigne, separateur)  ' pour déterminer la position du séparateur dans ta ligne
  3. x = Left(strLigne, pos_separateur)
  4. y = Mid(strLigne, pos_separateur + 1)  ' Le "+1" étant pour enlever le caractère du séparateur
  5. Debug.Print x
  6. Debug.Print y


 
C'est comme ça que je ferais en tout cas ;)


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 19-03-2010 à 09:36:24    

galopin01 a écrit :


 
Mettre un petit bout de ton fichier en MP... ou le uploader sur cjoint et nous donner l'adresse pour le télécharger.
 
On peut identifier ce caractère avec la méthode Open et décortiquer ta variable strLigne caractère par caractère, mais pour l'instant je suis un peu débordé pour te pondre un code.
 
On peut aussi identifier plus rapidement ce caractère en ouvrant directement le fichier dans Excel et en faisant un copier/coller du caractère dans cette formule entre les guillemets :
 
=CODE("_" )
 
A+


 
merci à tous pour votre aide, voila un morceau du fichier que je voudrais transformer :
 
http://cjoint.com/?dtjH0hT0z6

Reply

Marsh Posté le 19-03-2010 à 17:36:18    

bonjour,
Bon je te donne ce que j'ai obtenu avec ton fichier joint... Mais j'aurais préféré que tu me donnes le fichier texte que tu utilise pour ton test. car tu ne peux pas ouvrir le .prn en vba...
Bref...
Je te donne la macro qui parse correctement ton truc :
 
Sub test()
Dim strLigne$, Tablo
'Creation d'un fichier cible
Open "FichB.txt" For Output As #2
' Ouverture du fichier texte
Open "FichA.txt" For Input As #1
On Error Resume Next
While Not EOF(1)
Line Input #1, strLigne
Tablo = Split(strLigne, Chr(9))
Print #2, Tablo(0)
Print #2, Tablo(2)
Wend
Close #1
Close #2
End Sub
 
Le fichier cible obtenu :
http://pagesperso-orange.fr/galopin01/images/Fichb.jpg
 
Le On error Resume Next sert à outrepasser l'erreur EOF qui se produit en fin de boucle...
Bon YAPUKA bricoler correctement Tablo(0) et Tablo(2) avant de les envoyer dans ton fichier cible mais ça tu devrais y arriver...
 
Je n'ai pas essayé la suggestion de Turkleton qui me semble un peu plus compliquée mébon...
 
A+

Reply

Marsh Posté le 19-03-2010 à 17:54:12    

galopin01 a écrit :


Je n'ai pas essayé la suggestion de Turkleton qui me semble un peu plus compliquée mébon...


Oui, en fait c'était juste pour éviter l'usage du "Split" qui semblait lui donner des erreurs. C'est un peu comme si je l'avais ré-écris quoi (mais si le "split" fonctionne bien maintenant, autant l'utiliser) :jap:


---------------
If you think it could look good, then I guess it should
Reply

Marsh Posté le 19-03-2010 à 21:18:01    

Pour la route...
Je te donne le complément pour la mise en forme de ton fichier cible
 
Sub test()
Dim strLigne$, Tablo, Deb$, Fin$, Var$, tmp()
'Creation d'un fichier cible
Open "FichB.txt" For Output As #2
' Ouverture du fichier texte
Open "FichA.txt" For Input As #1
On Error Resume Next
While Not EOF(1)
k = k + 1
Line Input #1, strLigne
Tablo = Split(strLigne, Chr(9))
ReDim Preserve tmp(k)
tmp(k) = Tablo(0)
k = k + 1
ReDim Preserve tmp(k)
tmp(k) = Tablo(2)
Wend
jj = Int((k / 2) - 1)
For j = 1 To jj
    Deb = "s.Line(point1=(" & tmp(j + j - 1) & "," & tmp(j + j) & " ),"
    Fin = "point2=(" & tmp(j + j + 1) & "," & tmp(j + j + 2) & " ))"
    Var = Deb & Fin
'Debug.Print Var
Print #2, Var
Next
Close #1
Close #2
End Sub
 
et le résultat...
http://pagesperso-orange.fr/galopin01/images/FichResult.jpg
 
Heu... pour le dernier point, j'ai du imaginer car ton fichier source était un peu court !
 
A+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed