lire fichier texte jusqu'à ... [VBA] - VB/VBA/VBS - Programmation
Marsh Posté le 18-03-2010 à 08:05:17
bonjour,
Utilise split
Code :
|
A+
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...
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.
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+
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 !
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...
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+
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é !
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+
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...
Marsh Posté le 18-03-2010 à 18:45:13
cerber36 a écrit : et dans le cas d'un caractère invisible que conseillerais tu ? |
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+
Marsh Posté le 18-03-2010 à 19:25:29
Salut,
tu peux essayer ça :
Code :
|
C'est comme ça que je ferais en tout cas
Marsh Posté le 19-03-2010 à 09:36:24
galopin01 a écrit : |
merci à tous pour votre aide, voila un morceau du fichier que je voudrais transformer :
http://cjoint.com/?dtjH0hT0z6
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 :
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+
Marsh Posté le 19-03-2010 à 17:54:12
galopin01 a écrit : |
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)
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...
Heu... pour le dernier point, j'ai du imaginer car ton fichier source était un peu court !
A+
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 :
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 :
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 :
'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