Charger 8 col x 10000 lignes de Single d'un fichier txt dans un tableau(8,10000

Résolu
le_gwilherm Messages postés 3 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 1 décembre 2005 - 1 déc. 2005 à 16:24
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 - 1 déc. 2005 à 17:44
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

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2005 à 16:57
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
le_gwilherm Messages postés 3 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 1 décembre 2005
1 déc. 2005 à 17:14
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 !!
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2005 à 17:22
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2005 à 17:23
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 déc. 2005 à 17:31
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]
0
le_gwilherm Messages postés 3 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 1 décembre 2005
1 déc. 2005 à 17:34
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2005 à 17:40
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...
0
PCPT Messages postés 13272 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
1 déc. 2005 à 17:44
Rey -> tu peux t'expliquer stp?
0
Rejoignez-nous