Charger 8 col x 10000 lignes de Single d'un fichier txt dans un tableau(8,10000 [Résolu]

Signaler
Messages postés
3
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
1 décembre 2005
-
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
-
Bonjour à tous,

Je cherche à optimiser le chargement d'un fichier txt de valeur de type :
0.0002 0.2233 0.3233 0.3233 0.3233 0.3233 0.3233 0.3233
0.0002 0.2233 0.3233 0.3233 0.3233 0.3233 0.3233 0.3233
... fois 10000 lignes
je veux charger ces valeurs dans un tableau de Single de type tab(8,10000)

J'ai beaucoup regardé les sources disponibles mais je n'ai rien trouvé qui me permette de récupérer directement des nombres mais que des string.
Je précise que j'utilise ceci pour le chargement du fichier ce qui est tres rapide mais qui impose un traitement très long derrière :

[=code:
fichTxt = "C:/TestCurve/electrodesSignaux.txt"
Open fichTxt For Input As #1
tableau = Input(LOF(1), #1)
Close #1]
Pour l'instant je fais un découpage par ligne avec détection de fin de ligne
puis par mot "0.1212" puis remplacement du point en virgule puis conversion avec Csng()
Malheureusement cela met 3 min de traitement ce qui est beaucoup trop long !!!

Débutant en VB, je cherche des idées pour optimiser cette fonctionnalité

Merci à tous ceux qui voudront bien me filer un coup de pouce !

8 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
En VB, ton traitement sera long, de toutes façon...

j'ai cet algo, qui tourne pas trop mal...

(attention, aucun test ne controle le fichier)

Private Sub Form_Load()
Dim iFile As Integer
Dim Buffer As String
Dim Output() As Single
Dim LineCount As Long
Dim Items() As String
Dim i As Integer
iFile = FreeFile
Open "H:\a.txt" For Input As iFile
Do Until EOF(iFile)
Line Input #iFile, Buffer
LineCount = LineCount + 1
Loop
Close iFile

iFile = FreeFile
Open "H:\a.txt" For Input As iFile
ReDim Output(7, LineCount - 1)
LineCount = 0
Do Until EOF(iFile)
Line Input #iFile, Buffer
Items = Split(Buffer, " ", 8)
For i = 0 To 7
Output(i, LineCount) = CSng(Items(i))
Next i
LineCount = LineCount + 1
Loop
Close iFile

MsgBox Output(5, 3)
End Sub
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
3
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
1 décembre 2005

Ok Merci à toi !!
Maintenant ça prend 2 secondes, mais il faut quand même que je remplace les "." en "," des Items mais ce n'était pas ce qui prenait le plus de temps .

Bravo Vbfrance et à bientôt !!
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
utilises la fonction Val plutot que CSng, et pas besoin de remplacer les . en ,



à noter que ce remplacement des . en , n'est pas systématique, et dépend des parametres regionnaux de ta machine


Amusez-vous !
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
j'ai bien lu ?? tu passes deux trois minutes à deux secondes !!



ces temps me semble assez lointains... et même avec des milliers de
lignes, je n'atteignait pas 2 secondes, quel est la vitesse de ton ordi
??

Amusez-vous !
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS - MVP Visual Basic
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
salut,



autre solution, pas forcément meilleur..... mais apparemment rapide :






Option Explicit

'

Const lNbLignes As Long = 20 '10000

Dim aTxt(1 To 8, 1 To lNbLignes) As Single

'

'

Private Sub Form_Load()

Const fichTxt As String = "C:/TestCurve/electrodesSignaux.txt"

Dim sTableau As String



Open fichTxt For Input As #1

sTableau = Input (LOF(1), #1)

Close #1

sTableau = Replace(sTableau, ".", ",")



Dim aLines() As String

aLines = Split (sTableau, vbCrLf)



Dim aCellules() As String



Dim i As Long, j As Long

For i = 1 To lNbLignes

aCellules = Split (aLines(i - 1), " ")

For j = 1 To 8

aTxt(j, i) = CSng(aCellules(j - 1))

Next j

DoEvents

Next i



Erase aCellules

Erase aLines

End Sub





<small> Coloration
syntaxique automatique [AFCK]</small>



ps : j'aurais plûtot fait 10000*8 et non l'inverse... va savoir pourquoi....

PCPT [AFCK]
Messages postés
3
Date d'inscription
mercredi 23 novembre 2005
Statut
Membre
Dernière intervention
1 décembre 2005

c 'est pas un foudre de guerre mais je crois que j'avais surtout un probleme d'algorythmie et que je mettait cela sur le dos du pauvre VB

En effet la fonction val est très efficace et fonctionne chez moi !!

Merci encore et à bientôt
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
68
pas mal, ton code, pcpt, tu limites les accès au fichier, ce qui est souvent critique (quelle que soit la techno)...

pour milles lignes, on a environ 70ko de fichier, ce qui n'est pas franchement énorme, en mémoire...
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
41
Rey -> tu peux t'expliquer stp?