Bonjour à tous,
Moi et les regex comment dire .... c'est toujours une longue histoire.
Alors voilà je suis entrain de faire des tests de performances sur l'extraction de blocs de données dans des fichiers textes assez lourd (>500Mo).
La méthode de lire ligne par ligne le fichier pour ensuite réécrire cette ligne dans le fichier qui va bien est assez lourde. Dans mon cas expérimental je suis à 100Mo traité au bout de 10min.
Du coup j'ai eu l'idée de traiter mes blocs à l'aide d'une expression régulière pour ensuite écrire ces différents blocs dans des fichiers.
Voici le fichier que je traite (une version très allégée) :
Les 3 extractions que je souhaite faire sont les suivantes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 DMIG KAAX 0 6 2 0 144 DMIG* KAAX 559 1 * 559 1 5.436146121D+04 DMIG* KAAX 559 2 * 559 1 2.997528918D+00 * 559 2 9.038123638D+02 DMIG* KAAX 559 3 * 559 1 1.261634118D+01 * 559 2 5.046148890D+03 * 559 3 3.415594087D+04 DMIG* KAAX 559 4 * 559 1 3.371631556D+01 * 559 2-3.982366360D+01 * 559 3-4.056291690D+03 * 559 4 2.510124955D+04 DMIG VAX 0 9 2 0 1 DMIG* VAX 1 0 * 559 1 1.000000000D+00 * 559 2 1.000000000D+00 * 559 3 1.000000000D+00 * 559 4 1.000000000D+00 * 559 5 1.000000000D+00 * 559 6 1.000000000D+00 * 563 1 1.000000000D+00 * 563 2 1.000000000D+00 * 563 3 1.000000000D+00 * 563 4 1.000000000D+00 * 563 5 1.000000000D+00 DMIG PAX 0 9 2 0 1 DMIG* PAX 1 0 * 559 1 5.588391601D+01 * 559 2 1.168264164D+00 * 559 3 1.009317748D+01 * 559 4-1.081129573D+01 * 559 5-4.022276625D-01 * 559 6-8.447832210D-01 * 563 1 5.591312663D+01 * 563 2-6.528280697D+00 * 563 3-7.816536324D+00 * 563 4 1.078904913D+01 * 563 5-3.358274028D-01 * 563 6-8.739271547D-01
Extraction 1 :
Extraction 2 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 DMIG KAAX 0 6 2 0 144 DMIG* KAAX 559 1 * 559 1 5.436146121D+04 DMIG* KAAX 559 2 * 559 1 2.997528918D+00 * 559 2 9.038123638D+02 DMIG* KAAX 559 3 * 559 1 1.261634118D+01 * 559 2 5.046148890D+03 * 559 3 3.415594087D+04 DMIG* KAAX 559 4 * 559 1 3.371631556D+01 * 559 2-3.982366360D+01 * 559 3-4.056291690D+03 * 559 4 2.510124955D+04
Extraction 3 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 DMIG VAX 0 9 2 0 1 DMIG* VAX 1 0 * 559 1 1.000000000D+00 * 559 2 1.000000000D+00 * 559 3 1.000000000D+00 * 559 4 1.000000000D+00 * 559 5 1.000000000D+00 * 559 6 1.000000000D+00 * 563 1 1.000000000D+00 * 563 2 1.000000000D+00 * 563 3 1.000000000D+00 * 563 4 1.000000000D+00 * 563 5 1.000000000D+00
Pour les curieux les différents blocs représentent une matrice (raideur, efforts, vitesses pour ce cas précis).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 DMIG PAX 0 9 2 0 1 DMIG* PAX 1 0 * 559 1 5.588391601D+01 * 559 2 1.168264164D+00 * 559 3 1.009317748D+01 * 559 4-1.081129573D+01 * 559 5-4.022276625D-01 * 559 6-8.447832210D-01 * 563 1 5.591312663D+01 * 563 2-6.528280697D+00 * 563 3-7.816536324D+00 * 563 4 1.078904913D+01 * 563 5-3.358274028D-01 * 563 6-8.739271547D-01
Ce fichier peut contenir d'autres matrices et on ne peut pas savoir à l'avance quelles matrices seront présentes dans le fichier, enfin si mais pas simplement.
Du coup mon expression régulière est assez générale et ne fait pas intervenir les termes KAAX, PAX, VAX afin d'être compatible avec n'importe quelle fichier.
J'ai réussi à produire ceci et j'ai réalisé les test sous regex101 ce qui m'a permit de constater que je trouvais bien 3 match correspondant à mes 3 blocs précédemment mentionnés.
J'ai donc écris ce petit code, mais à ma surprise, le match ne se fait qu'avec le premier bloc.
Du coup je ne comprend pas bien ce qui se passe. J'ai bien essayé de passer par le search et introduire le flag re.MULTILINE mais rien à faire je match toujours avec le premier bloc uniquement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 import re with open("matrix.pch", "r") as pucnhfile : f = pucnhfile.read() pattern = re.compile(r"(DMIG\s+[. 0-9A-Z+-.*\n]*?)(?=DMIG |\Z)") m = re.match(pattern, f) print m.groups()
Lorsque je fait :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import re with open("matrix.pch", "r") as pucnhfile : f = pucnhfile.read() #pattern = re.compile(r"(DMIG\s+[. 0-9A-Z+-.*\n]*?)(?=DMIG |\Z)") #m = re.match(pattern, f) Matrix = re.match(r"(DMIG\s+[. 0-9A-Z+-.*\n]*?)(?=DMIG |\Z)", f, re.MULTILINE) print Matrix.groups()
j'obtiens le message comme quoi je suis out of range
Code : Sélectionner tout - Visualiser dans une fenêtre à part Matrix.groups()[2]
Les index 0 et 1 me revoient le même premier bloc.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 File "matrix_regex.py", line 15, in <module> print Matrix.groups()[2] IndexError: tuple index out of range
Si vous avez une idée de là où sa cloche, merci d'avance pour votre aide.
Partager