Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1685 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1974538
cerber36
Posté le 17-03-2010 à 12:53:45  profilanswer
 

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

mood
Publicité
Posté le 17-03-2010 à 12:53:45  profilanswer
 

n°1974777
galopin01
Posté le 18-03-2010 à 08:05:17  profilanswer
 

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+

n°1974805
cerber36
Posté le 18-03-2010 à 09:57:11  profilanswer
 

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...

n°1974873
galopin01
Posté le 18-03-2010 à 13:01:44  profilanswer
 

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
n°1974882
cerber36
Posté le 18-03-2010 à 13:39:00  profilanswer
 

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 !
 

n°1974885
cerber36
Posté le 18-03-2010 à 13:48:14  profilanswer
 

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
n°1974900
galopin01
Posté le 18-03-2010 à 14:10:09  profilanswer
 

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+

n°1974919
cerber36
Posté le 18-03-2010 à 14:52:57  profilanswer
 

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é !

n°1974940
galopin01
Posté le 18-03-2010 à 15:35:27  profilanswer
 

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+
 

n°1974965
cerber36
Posté le 18-03-2010 à 16:46:56  profilanswer
 

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...

mood
Publicité
Posté le 18-03-2010 à 16:46:56  profilanswer
 

n°1975010
galopin01
Posté le 18-03-2010 à 18:45:13  profilanswer
 

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
n°1975021
Turkleton
I don't quite understand you
Posté le 18-03-2010 à 19:25:29  profilanswer
 

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
n°1975094
cerber36
Posté le 19-03-2010 à 09:36:24  profilanswer
 

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

n°1975335
galopin01
Posté le 19-03-2010 à 17:36:18  profilanswer
 

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+

n°1975349
Turkleton
I don't quite understand you
Posté le 19-03-2010 à 17:54:12  profilanswer
 

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
n°1975393
galopin01
Posté le 19-03-2010 à 21:18:01  profilanswer
 

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+


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

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

 

Sujets relatifs
case in blabla (KSH) ===> fichier CSVcomparateur word +VBA-WORD
[Flash] Masquage selon fichier PNGcouper une facture vers un fichier client
Texte limité dadns un textareaVBA recherchev & combobox
Centrer tableau mais aligner texte à gaucheDéplacer une ligne de code dans un fichier XML ?
Extrusion dynamique selon un texte FLASH CS4[VBA] Lire à partir d'un fichier texte
Plus de sujets relatifs à : [VBA] lire fichier texte jusqu'à ...


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR