Calcul tableau source des data dans un fichier texte

Description

Le code permet d'expliquer d'ouvrir un fichier de data et manipuler les données :

- notion double/single
- fichier volumineux plus de 32000 data
- extraire des data dans un fichier
- utiliser les tableaux (trie, incrementer, longueur)
- calcul mathematique

Source / Exemple :


SUB calcul

'-------------------------------------------------------
'les parametres

DIM texte AS STRING 'lecture de ligne
DIM OFile AS STRING 'Fichier à ouvrir
DIM n AS DOUBLE 'nb ligne
DIM i AS DOUBLE 'compteur
DIM b AS DOUBLE 'compteur

'Coef de calcul
DIM LZ AS DOUBLE 'nb data
DIM SC AS SINGLE 'Scale Factor - label (SINGLE pour format scientifique)
DIM CX AS SINGLE 'Spacing CX (1.000000e-003) - label
DIM LX AS DOUBLE 'Nb XN
DIM MN AS DOUBLE '(ZA(LZ)-ZA(1))/(XN(LZ)-XN(1))
DIM BZ AS DOUBLE 'ZA(LZ)-MN*XN(LZ)
DIM ID AS DOUBLE 'Indice d'interval
DIM IS AS DOUBLE 'saut d'interval 100
DIM NB AS DOUBLE 'Quantite de point par interval
DIM MA AS DOUBLE 'Max MJ
DIM UD AS DOUBLE '10^6*MA - 18.4(16.97)

'tableau de valeur
DIM ZN() AS DOUBLE 'Array(VAL(texte))
DIM ZA() AS DOUBLE 'Array(ZN(LZ)*SC)
DIM XN() AS DOUBLE 'Array(interval LZ*CX jusqu'a LZ)
DIM ZL() AS DOUBLE 'Array(ZA(i)-(MN*XN(i))-BZ)
DIM MJ() AS DOUBLE 'Array((ZL(i+NB)-ZL(i))/(XN(i+NB)-XN(i)))

'les variables
OFile = "C:\data.txt"
ID = 4 'Indice de calcul : 4 mm
IS = 100 'saut tous les 100 points
'-------------------------------------------------------

OPEN OFile FOR INPUT AS #1'ouvre le fichier

WHILE NOT EOF(1)'boucle le fichier

LINE INPUT #1, texte

n = n + 1 'on incremente, c'est moche mais c'est vb

IF n = 4 THEN 'je veux extraire une valeur sur ma 4eme ligne

SC = VAL(MID$(texte, 22, 14))'conversion du string, la valeur est situé au 22eme caracteres et compte 14 caracteres

END IF

IF n = 7 THEN 'je veux extraire une valeur sur ma 7eme ligne

CX = VAL(MID$(texte, 11, 14))'On en prend un deusieme pour compliquer, 11eme caracteres et compte 14 caracteres

END IF

IF MID$(texte, 1, 1) = "-"  THEN 'je lie les data qui commence par "-"

LZ = LZ + 1 'toujours aussi moche, un ++LZ serait tellement mieux!
REDIM PRESERVE ZN(LZ) 'redimensione le tableau au fur et a mesure
REDIM PRESERVE ZA(LZ)

ZN(LZ) = VAL(texte) 'conversion du string avant d'ajouter dans le tableau
ZA(LZ) = ZN(LZ)*SC

END IF

WEND

CLOSE #1'fin de la lecture du fichier

LX = LZ*CX

FOR i = CX TO LX STEP CX 'incrementation d'une table par interval LZ*CX pour arriver jusqu'a LZ

b = b + 1

REDIM PRESERVE XN(b)

XN(b) = i

NEXT i

MN = (ZA(LZ)-ZA(1))/(XN(LZ)-XN(1)) 'On prend la premiere et la derniere valeur des tableaux
BZ = ZA(LZ)-MN*XN(LZ)

FOR i = 1 TO LZ

REDIM PRESERVE ZL(i)

ZL(i) = ZA(i)-(MN*XN(i))-BZ
    
NEXT i

NB = ID / CX

FOR i = 1 TO LZ STEP IS 'On boucle mais par interval NB

IF i+NB > LZ THEN 'on arrette le boucle si on depace le tableau

EXIT

END IF

b = 1 + b

REDIM PRESERVE MJ(b)

MJ(b) = (ZL(i+NB)-ZL(i))/(XN(i+NB)-XN(i))

NEXT i

FOR i = 1 TO UBOUND(MJ()) 'longueur du tableau

IF MJ(i) < 0 THEN 'Toutes mes valeurs doivent être positive

MJ(i) = MJ(i)*(-1)

END IF

IF MJ(i) > MJ(i-1) THEN 'pour trouver la plus grande valeur du tableau MJ

MA = MJ(i)

END IF

NEXT i

UD = 10^6*MA

MSGBOX "-- CALCUL --"& CHR$(13)_
 & "DATA :" &  STR$(LZ) & "/" & STR$(n) & CHR$(13)_
 & "SCALE FACTOR :" &  STR$(SC,3) & CHR$(13)_
 & "Spacing CX :" &  STR$(CX,3) & CHR$(13)_
 & "LX :" &  STR$(LX,3) & CHR$(13)_
 & "MN :" &  STR$(MN,3) & CHR$(13)_
 & "BZ :" &  STR$(BZ,3) & CHR$(13)_
 & "NB :" &  STR$(NB) & CHR$(13)_
 & "MA :" &  STR$(MA,3) & CHR$(13)_
 & "UD :" &  STR$(UD,4)

END SUB

Conclusion :


Si y'a mieux ou si on peut optimiser certaine chose, je suis preneur.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.