Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
I
INT-HACK-Groupe7
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
PC-AP-INT446-N-2023
Hacking Health
INT-HACK-Groupe7
Commits
282973a6
Commit
282973a6
authored
2 years ago
by
BIRK Renaud
Browse files
Options
Downloads
Patches
Plain Diff
Refactorisation de l'identification
parent
c6973aa6
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
poc/_identification.py
+40
-41
40 additions, 41 deletions
poc/_identification.py
with
40 additions
and
41 deletions
poc/_identification.py
+
40
−
41
View file @
282973a6
...
...
@@ -7,13 +7,14 @@ class Identification:
Classe de gestion de l
'
identification et du regroupement des données.
:param groups: Une liste de groupes trouvés à l
'
issue de l
'
OCR
:param csv_path: Un chemin vers le fichier CSV contenant les informations
sur les marques référencées.
sur les marques référencées
:param device: Un dispositif
"""
def
__init__
(
self
,
groups
:
List
[
Group
],
csv_path
=
"
data/csv
"
)
->
None
:
def
__init__
(
self
,
groups
:
List
[
Group
],
csv_path
=
"
data/csv
"
,
device
=
Device
()
)
->
None
:
self
.
groups
=
groups
self
.
csv_path
=
csv_path
self
.
device
=
D
evice
()
self
.
device
=
d
evice
def
extract_column
(
self
,
input_file_path
:
str
,
output_file_path
:
str
,
column_index
:
int
,
drop_duplicates
=
True
,
case_insensitive
=
True
)
->
None
:
"""
...
...
@@ -48,10 +49,8 @@ class Identification:
"""
Vérifie si une valeur fait partie d
'
une colonne d
'
un fichier séparé par
des virgules (comma-separated values)
:param input_file_path: Un chemin vers le fichier à traiter
:param output_file_path: Le chemin où générer le fichier
:param file_path: Un chemin vers le fichier à traiter
:param column_index: Indice de la colonne (en partant de 0)
:param drop_duplicates: Enlève les répétitions
:param case_insensitive: Ne respecte pas la casse
"""
with
open
(
file_path
,
'
r
'
,
encoding
=
'
utf-8
'
)
as
file
:
...
...
@@ -68,7 +67,7 @@ class Identification:
"""
Renvoie `True` si le mot passé en entrée correspond à une marque
présente dans la base de données des marques connues d
'
Oxyledger.
:word: Un mot à chercher
:
param
word: Un mot à chercher
"""
return
self
.
value_in_column
(
self
.
csv_path
+
"
/device_model_extracted_brand_name.csv
"
,
word
)
...
...
@@ -76,54 +75,54 @@ class Identification:
"""
Renvoie `True` si le mot passé en entrée correspond à un fabricant
présent dans la base de données des fabricants connus d
'
Oxyledger.
:word: Un mot à chercher
:
param
word: Un mot à chercher
"""
return
self
.
value_in_column
(
self
.
csv_path
+
"
/device_model_extracted_manufacturer_name.csv
"
,
word
)
def
est_code
_bar
r
e
(
self
,
cha
in
e
:
str
,
prefix
=
""
)
->
bool
:
def
is
_bar
cod
e
(
self
,
str
in
g
:
str
,
prefix
=
""
)
->
bool
:
"""
Teste si la chaîne donnée en paramètres est un code barre en prenant
en compte d
'
éventuelles erreurs liées à la phase d
'
OCR.
:param
cha
in
e
: Une chaîne de caractères à tester
:param
str
in
g
: Une chaîne de caractères à tester
:param prefix: Le préfixe à trouver
"""
# Initialisation
est
_prefix
ee
=
False
est
_prefix
ee_erreur_gauche
=
False
is
_prefix
=
False
is
_prefix
_left_error
=
False
# Recherche d'un code barre par son préfixe
if
prefix
:
# Cas classique
est
_prefix
ee
=
cha
in
e
[
0
:
len
(
prefix
)]
==
prefix
is
_prefix
=
str
in
g
[
0
:
len
(
prefix
)]
==
prefix
# Cas où on reconnait 01) au lieu de (01)
est
_prefix
ee_erreur_gauche
=
cha
in
e
[
0
:
len
(
prefix
)
-
1
]
==
prefix
[
1
:]
is
_prefix
_left_error
=
str
in
g
[
0
:
len
(
prefix
)
-
1
]
==
prefix
[
1
:]
# Recherche d'un code barre par le format de son préfixe sur au moins 4
# caractères
elif
len
(
cha
in
e
)
>=
4
:
elif
len
(
str
in
g
)
>=
4
:
# Reconnaît le motif (XY) avec X et Y des chiffres
motif_
prefix
e
=
re
.
compile
(
r
"
\(\d{2}\)(.*)
"
)
prefix
_pat
=
re
.
compile
(
r
"
\(\d{2}\)(.*)
"
)
# Reconnaît le motif XY) avec X et Y des chiffres
motif_prefixe_erreur_gauche
=
re
.
compile
(
r
"
\d{2}\)(.*)
"
)
prefix_pat_left_error
=
re
.
compile
(
r
"
\d{2}\)(.*)
"
)
# Cas classique
est
_prefix
ee
=
motif_
prefix
e
.
fullmatch
(
cha
in
e
)
is
_prefix
=
prefix
_pat
.
fullmatch
(
str
in
g
)
# Cas où on reconnait XY) au lieu de (XY) avec X et Y des chiffres
est
_prefix
ee_erreur_gauche
=
motif_prefixe_erreur_gauche
.
fullmatch
(
cha
in
e
)
is
_prefix
_left_error
=
prefix_pat_left_error
.
fullmatch
(
str
in
g
)
# La fonction renvoie vraie si l'une ou l'autre des conditions est remplie
return
est
_prefix
ee
or
est
_prefix
ee_erreur_gauche
return
is
_prefix
or
is
_prefix
_left_error
def
val_marqueur
(
self
,
cha
in
e
:
str
,
marqueur
:
str
)
->
str
:
def
is_tag
(
self
,
str
in
g
:
str
,
tag
:
str
)
->
str
:
"""
Teste si la chaîne donnée en paramètres contient un marqueur et renvoie
sa valeur ou `None` si le marqueur et/ou la valeur n
'
a/n
'
ont été(s)
trouvé(s)
:param
cha
in
e
: Une chaîne de caractères à tester
:param
marqueur
: Le marqueur à trouver
trouvé(s)
.
:param
str
in
g
: Une chaîne de caractères à tester
:param
tag
: Le marqueur à trouver
"""
mot
s
=
cha
in
e
.
split
(
"
"
,
1
)
mot1
=
mot
s
[
0
]
word
s
=
str
in
g
.
split
(
"
"
,
1
)
word_left
=
word
s
[
0
]
# S'il y a au moins deux mots et que le premier contient le marqueur
if
len
(
mot
s
)
==
2
and
marqueur
in
mot1
:
val
=
mot
s
[
1
].
strip
()
if
len
(
word
s
)
==
2
and
tag
.
lower
()
in
word_left
.
lower
()
:
val
=
word
s
[
1
].
strip
()
# Si la valeur du marqueur fait aux moins 2 caractères, on peut la
# considérer comme pertinente.
if
len
(
val
)
>
2
:
...
...
@@ -133,25 +132,25 @@ class Identification:
else
:
return
None
def
est
_date
(
self
,
cha
in
e
:
str
)
->
bool
:
def
is
_date
(
self
,
str
in
g
:
str
)
->
bool
:
"""
Renvoie `True` si la chaîne de caractères passée est une date au format
YYYY-MM-DD (où YYYY est l
'
année, MM le numéro du mois et DD le numéro du
jour du mois)
:param
cha
in
e
: La chaîne de caractères à tester
jour du mois)
.
:param
str
in
g
: La chaîne de caractères à tester
"""
motif
=
re
.
compile
(
r
'
\d{4}-\d{2}-\d{2}
'
)
return
bool
(
motif
.
fullmatch
(
cha
in
e
))
pat
=
re
.
compile
(
r
'
\d{4}-\d{2}-\d{2}
'
)
return
bool
(
pat
.
fullmatch
(
str
in
g
))
def
est_utile
(
self
,
cha
in
e
:
str
)
->
bool
:
def
is_useful
(
self
,
str
in
g
:
str
)
->
bool
:
"""
Renvoie `True` si la chaîne de caractères passée n
'
est ni un numéro de
lot, ni un code barre et ni une date (auquel cas il s
'
agit d
'
une
information pertinente)
:param chaine:
La
chaîne de caractères à tester
information pertinente)
.
:param chaine:
Une
chaîne de caractères à tester
"""
est
_numer
o_de_lot
=
self
.
val_marqueur
(
cha
in
e
,
"
lot
"
)
return
not
(
est
_numer
o_de_lot
or
self
.
est_code_barre
(
cha
in
e
)
or
self
.
est
_date
(
cha
in
e
))
is_batch
_num
b
er
=
self
.
is_tag
(
str
in
g
,
"
lot
"
)
return
not
(
is_batch
_num
b
er
or
self
.
is_barcode
(
str
in
g
)
or
self
.
is
_date
(
str
in
g
))
def
identify
(
self
)
->
Device
:
"""
...
...
@@ -170,17 +169,17 @@ class Identification:
if
subgroup
.
string
:
# Si la chaîne analysée commence par (01), alors on retire
# le préfixe "(01)", on obtient ainsi l'IUD
if
self
.
est_code
_bar
r
e
(
subgroup
.
string
,
"
(01)
"
):
if
self
.
is
_bar
cod
e
(
subgroup
.
string
,
"
(01)
"
):
self
.
device
.
uid
=
subgroup
.
string
[
3
:].
split
(
"
(
"
,
1
)[
0
].
replace
(
"
"
,
""
).
replace
(
"
)
"
,
""
)
else
:
# Si la chaîne analysée est aux abords d'un marqueur
# "ref", alors il s'agit d'une référence
ref
=
self
.
val_marqueur
(
subgroup
.
string
,
"
ref
"
)
ref
=
self
.
is_tag
(
subgroup
.
string
,
"
ref
"
)
if
ref
:
self
.
device
.
ref
=
ref
# Si on a trouvé la référence du dispositif, on lui
# ajoute
if
self
.
est_utile
(
subgroup
.
string
):
if
self
.
is_useful
(
subgroup
.
string
):
if
len
(
subgroup
.
string
)
>
2
:
if
self
.
is_brand_name
(
subgroup
.
string
):
self
.
device
.
brand_name
=
subgroup
.
string
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment