Debian Debian-France Debian-Facile Debian-fr.org Debian-fr.xyz Debian ? Communautés

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 22-01-2021 15:19:16

firstcode
Membre
Inscription : 17-01-2020

Extraire du texte depuis des fichiers PHP d'un gros répertoire

Bonjour à tous,


Avant tout j'espère que tous va bien pour vous tous en plein Covid et je vous souhaite à tous  une bonne étoile.
J'ai une demande spécifique qui ne pu etre résolu que par un génie et je suis certains qu'il est ici.

Je dispose d'un répertoire ( genre 7 giga ) avec du contenu uniquement en PHP par milliers LOL.


-J'aimerai savoir sil il est possible de parser le répertoire et scrapper le contenu des fichiers PHP et en extraire ce que je veu :


-Dans mon répertoire il y à environ 1 millions de fichier au format .php ils sont formulés pareil.

-A l'intérieur du php j'aimerai extraire des références numéros exemple : "REF:ABCEDF" et "Etagère 123456"

-Je voudrais extraire "ABCDEF" dans un fichier Excel   dans la colonne A , et dans la même colonne "Etagère 123456" automatiquement.


Un fichier txt peu aussi faire l'affaire.

Merçi la team.
smile:)

"Fais le ou ne le fais pas"

Hors ligne

#2 22-01-2021 16:33:22

Croutons
Membre
Distrib. : Debian10 Buster
Noyau : Linux 4.19.0-12-amd64
(G)UI : Mate
Inscription : 16-12-2016

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

Salut
ça se présente comment c'est lisible avec un éditeur de texte?

-->les cahiers du debutant<--      WikiDF-->Découvrir les principales commandes Linux<--
L' expérience, c'est le nom que chacun donne à ses erreurs. Oscar Wilde

En ligne

#3 22-01-2021 18:47:36

cyrille
Adhérent(e)
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

Hello
Faisable en python
On va dire que :
---- ton message est dans un fichier nommé aze.txt
---- ton motif de recherche pour la référence est toujours REF:ABCDEF avec un espace avant et après (mais pas avant ou après le ":")
---- ton motif pour l'étagère est toujours "Etagère" suivi d'un espace est de 6 chiffres

Voici un exemple de code qui fonctionne

import re

# Tu ouvres le fichier
with open('aze.txt','r') as file:
    # Lecture ligne par ligne
    for line in file:
        # Pour chaque ligne, on lit mot par mot
        for word in line.split():
            # si le mot correspond au motif 1 on le stocke dans une variable
            find1 = re.search(r'^"REF:[\w\.-]+', str(word))
            if find1 :
                find  = (find1.group(0))
                find = (find[5:])
                print(find)
               
            # si le mot correspond au motif 2 on le stocke dans une autre variable
            find2 = re.search(r'[0-9]{6}', str(word))
            if find2 :
                find2  = (find2.group(0))
                print(find2)
 



Tu as besoin de python3 et du module re. C'est tout.

Si tu as des centaines de fichiers, tu rajoutes une boucle pour lire les fichiers les uns après les autres (donc with open(my_file) et my_file tu l'obtiens après listage du(es) répertoire(s) contenant ces fichiers.
A la lecture du fichier,  tu stockes les résultats dans 1 tableau qui s'incrémentent au fur et à mesure de la lecture des fichiers source

Une fois la lecture effectuée, tu as ton tableau avec tes références (paire par ligne). Tu pars de ce tableau pour coller dans un tableau ods ou xls (finalement c'est du xml). Jette un oeil sur le module ooopy et / ou panda (à vérifier) qui te permet de créer des fichiers type excel depuis python


Donc finalement, un peu de temps de code, mais rien comparé à une méthode manuelle wink

Dernière modification par cyrille (22-01-2021 18:55:55)


"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."
== Ainsi parlait Zarathoustra. ==
=== Nietzsche ===

Hors ligne

#4 22-01-2021 18:53:15

cyrille
Adhérent(e)
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

            find1 = re.search(r'"REF:[A-z]{6}', str(word))


Mieux car ne prend réellement que REF: suivi de 6 lettres quelque soit la casse wink

Dernière modification par cyrille (22-01-2021 18:57:29)


"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."
== Ainsi parlait Zarathoustra. ==
=== Nietzsche ===

Hors ligne

#5 22-01-2021 18:54:49

cyrille
Adhérent(e)
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

Et hop exemple de sortie

/usr/bin/python3.8 /home/ragnarok/PycharmProjects/test/test.py
ABCEDF
123456
123456

Process finished with exit code 0



On voit 2 fois 123456 car ton message le contient 2 fois, mais je présume que dans tes fichiers les valeurs iront par paires

Dernière modification par cyrille (22-01-2021 18:58:43)


"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."
== Ainsi parlait Zarathoustra. ==
=== Nietzsche ===

Hors ligne

#6 25-01-2021 14:49:46

firstcode
Membre
Inscription : 17-01-2020

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

Bonjour Cyrille,

Merçi pour ton retour.
Le fichier que je dois traiter est au format .htm voiçi le contenu du <div> que je veu récupérer.


/div>
<div class="panel-body">
<h2>ABCDEF</h2><label class="tel" title="ETAGERE04">12345678</label><p><br>BOX06<br>UNITEA</p>
</div>


Ce fichier .htm j'en ai beaucoup. Et je souhaite récupérer dans un fichier excel par exemple ce type d'information en colonne.

BCDEF        ETAGERE04     12345678  BOX06    UNITEA

Peu tu stp me faire le fichier python ?

Merçi encore

"Fais le ou ne le fais pas"

Hors ligne

#7 25-01-2021 18:10:02

cyrille
Adhérent(e)
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

Bon , le mieux serait de le faire toi même. On ne donne pas un poisson mais on apprend à pécher.
Je te file des pistes
Si la structure de ton fichier est bonne (1er motif 6 lettres MAJ, second ETAGERE+2CHIFFRES, 3e: suite de 8 CHIFFRES, puis BOX et 2 chiffres et enfin dernier motif UNITE ET 1 LETTRE, je travaillerai plutot directement avec sed


Soit le fichier suivant : test.txt

<html>
<body>jgfjdgfj</body>
<p>jlksdlkjlsdjglgdsjldjsgl</p>
<h2>ABCDEF</h2><label class="tel" title="ETAGERE34">12345678</label><p><br>BOX06<br>UNITEA</p>
<h3>
<h2>ZERDEF</h2><label class="tel" title="ETAGERE04">88888888</label><p><br>BOX12<br>UNITER</p>
<div><htlm>
<h2>UYRDEF</h2><label class="tel" title="ETAGERE12">87654321</label><p><br>BOX65<br>UNITEZ</p>
</body>
</html>



Alors cette regex sed fera le boulot

sed -n 's/<h2>\([A-Z]\{6\}\).*\(ETAGERE[0-9]\{2\}\).*\([0-9]\{8\}\).*\(BOX[0-9]\{2\}\).*\([A-Z]\{6\}\).*/\1;\2;\3;\4;\5;/p' test.txt




sortie shell

ABCDEF;ETAGERE34;12345678;BOX06;UNITEA;
ZERDEF;ETAGERE04;88888888;BOX12;UNITER;
UYRDEF;ETAGERE12;87654321;BOX65;UNITEZ;



L'idée, rediriger cette sortie vers un fichier (sortie.csv) qui tu incrémente à la lecture de chaque fichier

$ sed -n 's/<h2>\([A-Z]\{6\}\).*\(ETAGERE[0-9]\{2\}\).*\([0-9]\{8\}\).*\(BOX[0-9]\{2\}\).*\([A-Z]\{6\}\).*/\1;\2;\3;\4;\5;/p' test.txt >> sortie.csv
18:01:43 ▶ ragnarok@valhalla ▷ ~/test
$ cat sortie.csv
ABCDEF;ETAGERE34;12345678;BOX06;UNITEA;
ZERDEF;ETAGERE04;88888888;BOX12;UNITER;
UYRDEF;ETAGERE12;87654321;BOX65;UNITEZ;




Voilà ensuite tu colles cette "regex sed " sur une boucle qui fera un travail recursif depuis ton répertoire parent.
Je te file la fonction, adapte à ton dossier où sont stockés tes données , tu n'as qu'à adapter les 2 premières variables




#!/bin/sh
 
dossierDeTravail="/home/$USER/pathDir/vers/le/dossier/de/travail"
$file_output = "/home/$USER/Path/ver/ton/fichier/ou/tu/recupere/tout.csv"
 
recursiveSearch() {
    [ -r "$1" ] && [ -x "$1" ] || return 1 # Si on peut fouiller dans le dossier
    [ "`ls "$1" | wc -l`" == "0" ] && return 0 # Si le dossier est vide
    for file in "$1"/*; do
        if [ -d "$file" ]; then
            recursiveSearch "$file"
        fi
        sed -n 's/<h2>\([A-Z]\{6\}\).*\(ETAGERE[0-9]\{2\}\).*\([0-9]\{8\}\).*\(BOX[0-9]\{2\}\).*\([A-Z]\{6\}\).*/\1;\2;\3;\4;\5;/p' $file >> $file_output

    done
}
 
recursiveSearch  $dossierDeTravail





PS : normalement ça ne craint rien pour tes données, mais prends pas de risque, teste sur un petit échantillon de backup
PS2 : je n'ai rien testé, donc peut être qq coquilles à revoir
PS3 : sans doute pas optimisé / ressources CPU mais je ne pense pas que ce soit forcement ce que tu cherches

Très à la bourre

SI je ne me suis pas planté le fichier $file_output devrait contenir tous tes datas, champs séparés par un point vrigule. Tu n'auras plus qu'à importer dans ton tableau comme un tradionnel fichier cvs

Dernière modification par cyrille (25-01-2021 18:14:41)


"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."
== Ainsi parlait Zarathoustra. ==
=== Nietzsche ===

Hors ligne

#8 25-01-2021 20:06:43

vv222
Administrateur
Lieu : Bretagne
Distrib. : GNU/Linux Debian « Sid »
Noyau : Linux ≥ 5.10 (amd64)
(G)UI : Openbox
Inscription : 18-11-2013
Site Web

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

Si les fichiers HTML respectent tous la même structure, je passerais par un parseur XML quelconque (il en existe pour probablement la quasi-totalité des langages de programmation) pour générer un fichier dans un format simple, comme CSV.

Comme cyrille le montre plus haut, ça se fait aussi avec des expressions régulières. Mais un parseur XML devrait être plus robuste et surtout plus simple à utiliser.

Jouer sous Debian ? Facile !

Hors ligne

#9 26-01-2021 08:26:12

firstcode
Membre
Inscription : 17-01-2020

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

Merçi Cyrille et vv222 pour vos messages.
@Cyrille, je vais tester ta procédure aujourd'hui merci.gif
@vv222 il existe un parseur XML qui fonctionne en local sur une machine ?
Bien à tous,old_geek.gif

"Fais le ou ne le fais pas"

Hors ligne

#10 26-01-2021 08:36:25

cyrille
Adhérent(e)
Distrib. : SID + FreeBSD. Stable sur serveurs.
(G)UI : Xfce/Openbox
Inscription : 21-06-2020
Site Web

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

@vv222
ai proposé une regex sed car il doit récupérer aussi des informations à l'intérieur du code html (ex, dans <label class="tel" title="ETAGERE34"> --> ETAGERE34 ) et je n'étais pas sûr qu'un parser puisse faire cela. Enfin, je n'utilise pas trop cette technologie, donc intéressé de savoir si possible ou pas.

Dernière modification par cyrille (26-01-2021 08:36:37)


"Ils ne me comprennent point, je ne suis pas la bouche qu’il faut à ces oreilles."
== Ainsi parlait Zarathoustra. ==
=== Nietzsche ===

Hors ligne

#11 26-01-2021 14:52:42

vv222
Administrateur
Lieu : Bretagne
Distrib. : GNU/Linux Debian « Sid »
Noyau : Linux ≥ 5.10 (amd64)
(G)UI : Openbox
Inscription : 18-11-2013
Site Web

Re : Extraire du texte depuis des fichiers PHP d'un gros répertoire

firstcode a écrit :

il existe un parseur XML qui fonctionne en local sur une machine ?


Très certainement, mais je ne pourrai pas en lister : je n'ai eu l'occasion de bosser avec du XML que dans le cadre de développement de logiciels plus gros, souvent en PHP.

---

cyrille a écrit :

ai proposé une regex sed car il doit récupérer aussi des informations à l'intérieur du code html (ex, dans <label class="tel" title="ETAGERE34"> --> ETAGERE34 ) et je n'étais pas sûr qu'un parser puisse faire cela. Enfin, je n'utilise pas trop cette technologie, donc intéressé de savoir si possible ou pas.


Ça se fait très simplement, indépendamment de la syntaxe du parseur il s'agit ici de lui demander la valeur de l'attribut title de la balise label.


Jouer sous Debian ? Facile !

Hors ligne

Pied de page des forums