Lire un fichier txt et le mettre dans un tableau

spopol Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 21 avril 2009 - 9 avril 2009 à 17:55
spopol Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 21 avril 2009 - 21 avril 2009 à 11:51
Bonjour,
j'ai un fichier texte qui commence ainsi:

Nervure 4 Corde :  166.85
1.0000000   0.0000000
0.9965500   0.0004661
0.9864900   0.0020560
0.9704900   0.0049535
le but etant de passer la premiere ligne
et de couper les lignes suivantes ainsi (elle sont toutes calibré de la meme façon 9 caracteres+3espaces+9caracteres)
les 9 premiers caracteres dans le tablo x(i) et les 9 derniers dans le tablo y(i)
j'ai récupérer ce code qui lit bien le fichier de ligne a ligne mais je n'arrive pas a charger mes 2 tablos:
merci pour votre aide
 Dim numFile As Long

numFile = FreeFile
Open "C:\\ASK-18\profils\e205&e211N04.dat" For Input As #numFile
    While Not EOF(numFile)
       Line Input #numFile, sTemp 'récupère une ligne entière
       T_x = Split(sTemp, "   ") 'découpe la chaine selon les espaces
       'tablo = Split(sTemp, vbTab)'découpe la chaine selon les tabulation
       For i = LBound(T_x) To UBound(T_x)
          ' Faire quelque chose avec la donnée tablo(i)
       MsgBox T_x(i)
       Next i
    Wend
Close #numFile

7 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
9 avril 2009 à 19:42
Salut
Déjà, le format du chemin de ton fichier, avec le double \\ en tête, est bien bizarre.
Si tu dois sauter la première ligne, il faut la lire et l'ignorer avant de commencer la boucle
Après ton Split, tu récupères T_x(0) et T_x(1) : pourquoi te faire suer avec le LBound - UBound ?
Une fois que tu as ces deux données, que veux-tu en faire ?
Si tu dois constituer un tableau avec toutes les lignes, il faut en créer un autre.
T_x n'est qu'un tableau temporaire qui ne comportera jamais rien d'autre que 2 items, ceux de la dernière ligne que tu viens de lire.
genre :
   Dim TableauTotal() As String
Avec cette déclaration, la (ou les) dimension du tableau ne sont pas dédinies
En supposant que ton tableau ait cette forme :
   TableauTotal(0 To ??, 0 To 1)
Le 0 To ?? seraient les enregistrements de la ligne
Et 0 To 1 seraient les deux variables de chaque ligne
Le ?? désignera la dimension globale de ton tableau.
Comme tu ne le connais pas à l'avance, il te faudra utiliser ReDim
Il faudra donc compter les lignes, de 0 à X, en incrémentant un compteur dans ta boucle (iCompteur).
Avant d'associer les données, le ReDim :
   ReDim Preserve TableauTotal(0 To iCompteur, 0 To 1)
(le Preserve est là pour éviter le vidage du tableau)
puis entrer les données récupérées
   TableauTotal(lCompteur, 0) = T_x(0)
   TableauTotal(lCompteur, 1) = T_x(1)

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_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 avril 2009 à 19:46
PS : Le Split ne fonctionne qu'avec des String
Alors, bien que les données ressemblent à des Single, il faudra dimensionner T_x en String
Par contre, TableauTotal peut être dimensionné en Single, en utilisant les outils de conversion adéquats (CSng) lors de l'écriture des données
0
spopol Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 21 avril 2009
10 avril 2009 à 09:46
bonjour,
merci beaucoup pour tes reponses cela m'eclaire grandement
pour ce qui concerne le double slash ce n'est pas important j'ai racourci le chemin pour demander de l'aide et j'ai pas fait gaffe de retirer le slash qui est en trop
en fait ces données sont des coordonnées de points (abscisses et ordonnées) une fois dans mon tableau je recupere ces coordonnées pour dessiner le nuage de point et les relier avec une ligne tout ceci dans une macro vb autocad 2004,
j'ai reussi la suite de la macro (partie dessin mais je n'arrivais pas a trouver les syntaxes pour lire le fichier txt et mettre dans un tableau les valeurs) la derniere fois que j'ai fait du vb c'été la version visual basic 3.1 il y a for for lointain !
jusqu'a present je reprenais le fichier txt dans le note pad pour mettre les coordonnées sous cette forme :
corde = 168.86
T_x = Array(1, 0.99655, 0.98649, 0.97049, 0.94916, 0.92285, 0.89175, 0.85624, 0.81684, 0.77412, 0.72866, 0.68108, 0.63204, 0.58218, 0.53217, 0.48265, 0.4341, 0.3868, 0.34101, 0.29699, 0.25496, 0.21508, 0.17764, 0.14302, 0.11157, 0.0836, 0.05937, 0.03909, 0.02292, 0.01097, 0.00331)

T_x1 = Array(0.00002, 0.00233, 0.01065, 0.02419, 0.04291, 0.06669, 0.09534, 0.12864, 0.16627, 0.20783, 0.2529, 0.30097, 0.35149, 0.40388, 0.45751, 0.51174, 0.56591, 0.61938, 0.67149, 0.7216, 0.76911, 0.81343, 0.854, 0.89034, 0.92195, 0.9486, 0.97017, 0.98635, 0.99651, 1)

T_y = Array(0, 0.0004661, 0.002056, 0.0049535, 0.0088623, 0.0133722, 0.0183303, 0.0237931, 0.0297323, 0.0360478, 0.0426379, 0.0493494, 0.0560278, 0.0624828, 0.0684701, 0.0736832, 0.0777423, 0.0803819, 0.0814602, 0.0809151, 0.0787529, 0.0750958, 0.070182, 0.0642131, 0.0573478, 0.0497489, 0.0415782, 0.0330256, 0.0243057, 0.0156831, 0.007519)

T_y1 = Array(0.0006113, -0.0050228, -0.0099609, -0.0144218, -0.0181508, -0.0211076, -0.0232933, -0.0247483, -0.0255142, -0.025669, -0.0252906, -0.0244553, -0.0232359, -0.0216943, -0.0198602, -0.0177774, -0.0155575, -0.0133353, -0.0112068, -0.009231, -0.0074546, -0.0059033, -0.0045758, -0.0034615, -0.0024719, -0.0014951, -0.0006007, -0.0000545, 0.0000473, 0)
solution tres tres fastidieuses surtout quand il faut repeter cette manipe + de 20fois !
0
spopol Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 21 avril 2009
10 avril 2009 à 15:49
bonjour,
j'ai modifier mon prog comme vous me l'avez conseillé
Dim numFile As Long
Dim TextLine As String
Dim Tableautemp() As String
Dim TableauTotal() As String
i = 1
k = 1

numFile = FreeFile
Open "C:\ASK-18\profils\e205&e211N05.dat" For Input As #numFile
   While Not EOF(numFile)
       Line Input #numFile, sTemp 'récupère une ligne entière
       Tableautemp = Split(sTemp, "   ") 'découpe la chaine selon les espaces
       'tablo = Split(sTemp, vbTab)'découpe la chaine selon les tabulation
       If  k > 1 Then 'permet de sauter 1ere ligne et k va me permettre d'avoir le nbre d'enrgistrement de mon tableau
      
          ReDim Preserve TableauTotal(0 To i, 0 To 1)
            MsgBox i
            TableauTotal(i, 0) = Tableautemp(0)
            TableauTotal(i, 1) = Tableautemp(1)
            i = i + 1
       'MsgBox T_x(i)
       
       End If
       k = k + 1
    Wend
 
Close #numFile

pb c'est que lors du second passage j'ai se message
Erreur d'execution '9':
l'indice n'appartient pas à la selection

en fait des que i est incrementé je vois pas pourquoi.  un tableau se remplit bien ainsi ? ou ai je vraiment tout oublié ?!
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
11 avril 2009 à 18:14
Re
Pour lire et ne pas traiter la première ligne, supprime ton 'k' qui complique tout et ajoute cette ligne :
Open "C:\ASK-18\profils\e205&e211N05.dat" For Input As #numFile
   Line Input #numFile, sTemp ' Lit la 1ere ligne sans la traiter
   While Not EOF(numFile)

Le tableauTotal est dimensionné de 0 à X : i devrait avoir la valeur 0 au démarrage, pas 1.
Impossible de lire une image située sur ton PC : Il faut que l'image que tu proposes en lecture dans ce forum soit accessible de tous, sur un site perso, par exemple.

Le bug a lieu sur quelle ligne ?
Que vaut 'i' au moment du bug ?
Quelle est le plus grand indice de TableauTotal ? --> UBound(TableauTotal)
Quelle est le plus grand indice de TableauTemp ? --> UBound(TableauTemp)
car, pour ce dernier, s'il n'y a pas suffisemment de donnée dans la ligne lue, il se peut que le Split n'ait qu'une donnée au lieu de 2 --> Problème de séparateur ou autre

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
spopol Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 21 avril 2009
14 avril 2009 à 09:27
bonjour
merci encore une fois pour votre reponse;
je ne laisse pas tombé mais j'ai plus de boulot cette semaine donc je ne sais pas si je vais avoir le temps de regarder cela. je vous tiendrai au courant de l'evolution de mes avancés.
0
spopol Messages postés 5 Date d'inscription jeudi 9 avril 2009 Statut Membre Dernière intervention 21 avril 2009
21 avril 2009 à 11:51
bonjour,
j'ai eu un peu plus de temps ce we pour bosser sur mon script
j'ai fini par abandonner les tableaux effectivement comme vous me le signalez dans votre dernier post le split n'avait pas forcement 2 données
j'ai repris la bonne vieille methode du left en right qui a le merite de fonctionner
j'ai du revoir aussi la conception de mon script (j'aime bien proceder par ordre pour une question de maintenance) et au lieu de proceder par etape (recuperation des données puis faire traitement sur données) je fais tout en un.
voila si ça peut interesser du monde le script final :
Sub Example_Copy()
    
        Dim point1(0 To 2) As Double, point1old As Double
        Dim point2(0 To 2) As Double, point2old As Double
        Dim i, j, k As Integer
        Dim corde As Double
        Dim startPoint(0 To 2) As Double
       Dim endPoint(0 To 2) As Double

Dim numFile As Long
Dim chemin As String

chemin = "C:\ASK-18\profils\e211.dat"
unefois = True
corde = 300
numFile = FreeFile
Open chemin For Input As #numFile
   Line Input #numFile, sTemp ' Lit la 1ere ligne sans la traiter
   While Not EOF(numFile)
        Line Input #numFile, sTemp 'récupère une ligne entière
     
       c_x = Left(sTemp, 9) * corde + 1350
       c_y = Right(Left(sTemp, 21), 9) * corde + 1400
    
        If unefois = True Then
            point1old = c_x
            point2old = c_y
            unefois = False
        Else
        ' Definie le debut et la fin des points pour la ligne            startPoint(0) point1old: startPoint(1) point2old: startPoint(2) = 0#            endPoint(0) c_x: endPoint(1) c_y: endPoint(2) = 0#
   
        ' crée la ligne dans l'espace modele
            Set lineObj = ThisDrawing.ModelSpace.AddLine(startPoint, endPoint)
            point1old = c_x
            point2old = c_y
        End If
     
Close #numFile

ZoomAll 'evite d'avoir un point sur l'espace dessin
MsgBox "dessin executé.", , "Macro Profil"
   
End Sub

encore une fois merci beaucoup pour votre aide !
je n'hesiterai pas a vous recontacter si j'ai de nouveau besoin, je desesperai de trouver un forum avec des reponses intelligentes et pas du genre "tu lui a pas dit svp et merci"
0
Rejoignez-nous