Extraire des données (url) d'un fichier.

bugsfunny

Membre confirmé
18 Avril 2020
72
6
27
Bonjour,

J'ai plusieurs fichiers .json, .txt... assez volumineux dans lesquels je voudrais récupérer des informations.

Dans mon .json, je voudrais pouvoir extraire tout les url qui y sont dans une page html par exemple. J'ai pas mal cherché mais tout ce que j'ai pu trouver ressemble à un marteau pilon pour écraser une mouche. J'ai pataugé avec les Regex, les convertisseurs online .json => html...

Qu'est ce que vous préconisez ? Pour ma part j'imaginais un logiciel capable de filtrer les champs à la volée mais sans y parvenir.

D'une manière plus générale, quel logiciel pour extraire des données d'un fichier (texte par exemple) et enregistrer ce résultat dans un autre. Une sorte de regex gui. Mais peut être existe t il autre chose auquel je n'ai pas pensé.

Merci.
 
Bonjour,

S'il s'agit de récupérer des adresses url type "http....." dans un fichier texte, un petit applescript pourra peut-être faire l'affaire.

Le script ci-dessous, te demande, à son lancement, de sélectionner le fichier texte à traiter et crée un fichier texte "les adresses URL.txt" sur le bureau contenant toutes les adresses URL trouvées. Il te met un message lorsqu'il a terminé.

pour installer le script
Ouvrir Editeur de script qui se trouve dans Application—>Utilitaires
Clic sur le bouton “Nouveau document” en bas à gauche
Dans la fenêtre qui s’ouvre faire un copier coller du script.
Cliquer sur exécuter en haut à gauche

Dis moi si cela te convient.
Pour les fichiers json, je ne connaît pas!
ils peuvent peut-être être converti en fichier texte.

Bloc de code:
set monfichier to choose file with prompt "Sélectionner le fichier texte à traiter"
open for access monfichier -- ouvre ce fichier en lecture
set vartoto to read monfichier -- lit le fichier et le met dans la variable vartoto
close access monfichier -- ferme le fichier

set lelog to open for access ((path to desktop folder as text) & "les adresses URL.txt") as text with write permission
write "Mes adresses URL récupérées" & return to lelog starting at eof
close access lelog


set nblignes to count of paragraph of vartoto
repeat with j from 1 to nblignes
    set vartoto1 to ""
    set AppleScript's text item delimiters to ""
    set vartoto1 to paragraph j of vartoto as string
    set la to offset of "http" in vartoto1
    if la = 0 then
    else -- Si la ligne contient un http
        set separateur to {">", "<", " ", "(", ")", "[", "]"} -- Défini les séparateurs possible avant et après une adresse
        set nbchar to count item of vartoto1
        set la1 to (la - 1)
        set lafin to (la + 1)
        repeat
            if item lafin of vartoto1 is in separateur then
                exit repeat
            end if
            set lafin to (lafin + 1)
            if lafin = nbchar + 1 then exit repeat
        end repeat
        
        set adress to text (la1 + 1) thru (lafin - 1) of vartoto1
        
        set lelog to open for access ((path to desktop folder as text) & "les adresses URL.txt") as text with write permission
        write adress & return to lelog starting at eof
        close access lelog
        
        set vartoto1 to characters (la + 1) thru nbchar of vartoto1 as string
        set nbchar to count item of vartoto1
        set la to offset of "http" in vartoto1
        set la1 to (la - 1)
    end if
end repeat

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Oups!
Je viens de voir un bug, si il y a plusieurs adresses url dans la même paragraphe, il ne prend en compte que la première..
Après quelques recherches sur les fichiers json, j'ai ajouté 2 séparateurs (la virgule et les quotes) qui devrait permettre de les traiter également.

Voilà la correction:

Bloc de code:
set monfichier to choose file with prompt "Sélectionner le fichier texte à traiter"
open for access monfichier -- ouvre ce fichier en lecture
set vartoto to read monfichier -- lit le fichier et le met dans la variable vartoto
close access monfichier -- ferme le fichier

set lelog to open for access ((path to desktop folder as text) & "les adresses URL.txt") as text with write permission
write "Mes adresses URL récupérées" & return to lelog starting at eof
close access lelog


set nblignes to count of paragraph of vartoto
repeat with j from 1 to nblignes
    set vartoto1 to ""
   
    set AppleScript's text item delimiters to ""
    set vartoto1 to paragraph j of vartoto as string
   set quote to ASCII character 34
    repeat
        set la to offset of "http" in vartoto1
        if la = 0 then
        else -- Si la ligne contient un http
            set separateur to {">", "<", " ", "(", ")", "[", "]", ",", quote} -- Défini les séparateurs possible avant et après une adresse
            set nbchar to count item of vartoto1
            set la1 to (la - 1)
            set lafin to (la + 1)
            repeat
                if item lafin of vartoto1 is in separateur then
                    exit repeat
                end if
                set lafin to (lafin + 1)
                if lafin = nbchar + 1 then exit repeat
            end repeat
           
            set adress to text (la1 + 1) thru (lafin - 1) of vartoto1
           
            set lelog to open for access ((path to desktop folder as text) & "les adresses URL.txt") as text with write permission
            write adress & return to lelog starting at eof
            close access lelog
            set vartoto1 to characters (lafin - 1) thru nbchar of vartoto1 as string
            set nbchar to count item of vartoto1
            set la to offset of "http" in vartoto1
            set la1 to (la - 1)
        end if
        if la = 0 then
            exit repeat
        end if
    end repeat
end repeat

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell
 
Dernière édition:
Super ! Merci, je vais regarder ça en détails ce soir.

Dans mon premier fichier il doit y avoir dans les 6000 urls pour 360 Mo.

Jusqu'ici j'avais regardé du côté des éditeurs .json. Mais en filtrant par urls, il reste quand même beaucoup de code autour et je peine à exploiter le résultat. j'ai également regardé du côté de "jq" pour faire des requêtes mais mon cakebrew m'indique que mon système 10.13.6 est trop vieux pour faire l'installation.

J'ai également regardé du côté des convertisseur json => html mais je patauge encore. Bref j'explore un peu tout mais comme je voudrais apprendre à faire ce genre de chose plus proprement je vais creuser votre code.

Je pensais également que je pouvais le faire avec un find ou un grep qui copie le résultat dans un fichier externe mais ça passe par du Regex qui me parait très complexe quand on début pour filtrer les bonnes données.
 
Bonjour,

Ou la la ! 360 Mo le fichier.
Avec un applescript cela risque d'être très très long.
Pour les fichiers json , il faut que je regarde de plus près car il comportent des caractères qui risques de bloquer le script.
 
Finalement après avoir testé sur plusieurs fichiers (texte et json) pas de problème, à part que c'est très long...
Chez moi pour un fichier json de 12 Mo qui contient 180 000 paragraphes et environ 21 000 adresses il a fallu 42 minutes.
 
Je vous donne quelques nouvelles.

J'ai commencé à éplucher votre code sur des petits fichiers pour comprendre et ça a l'air de fonctionner.

En parallèle, j'ai réussi à installer "jq" (par je ne sais quel miracle puisqu'au départ il trouvait mon système trop vieux. Toujours est il que c'est un peu plus rapide. L'inconvénient, c'est que "jq" se ballade dans le code un peu comme dans une arborescence de fichiers système. Sauf qu'au lieu d'avoir des dossiers et des fichiers, on a des tableaux et des objets. Mais il faut donc connaître la structure de données de son fichiers pour pointer au bon endroit. Chose qui n'est pas aisée quand le fichier à creuser est énorme au point d'être difficile à éditer.

Donc "jq" c'est rapide à condition de bien savoir où chercher.
Votre solution fonctionne même si effectivement il faut être patient.
J'ai essayé avec grep également. Ca a l'air d'être une bonne piste à explorer.

Comme j'aimerai vraiment apprendre à faire ça bien, je vais encore creuser.
 
Dernière édition:
Bonjour,

Je t'ai bricolé un truc en perl (bricolé est le bon mot, c'est mon 1er script en perl) qui devrait faire le job plus vite.

pour l'utiliser:
1 - faire un copier coller du script dans un fichier texte brut que j'appelle monscript.pl et que je place dans le même dossier que le fichier à traiter.
2 - le rendre exécutable. pour çà dans le terminal tu tapes chmod a+x un espace suivi du chemin_du_fichier_monscript.pl

pour le lancer
1 - dans le terminal tu fais un cd espace suivi du chemin du dossier contenant les fichiers.
2 - dans le terminal tu entres cat chemin_de_ton_fichier_a_traiter | chemin_du_fichier_monscript.pl
et tu valides.
Un fichier de sortie avec pour nom sortie.txt est créé dans le même dossier et devrait contenir tes url.

Fais quelques essais pour vérifier si cela fonctionne

Bloc de code:
#!/usr/bin/perl


while(my $lig = <>) {
chomp($lig);

$lig = lc ($lig);
next if $lig !~ /http/ ;

$|=1 ;

$mot = "http";
$nb = () = $lig =~ /($mot)/g;
$position = index($lig,$mot);

#nouvelle variable pour boucle
$laligne = $lig;
for (my $i = 1; $i <= $nb; $i++) {
 
$lig = lc ($lig);
$position = index($laligne,$mot);

($l,$suite) = split(/http/,$laligne);
($fin) = split (/ /,$suite);
($fin) = split (/>/,$fin);
($fin) = split (/"/,$fin);
($fin) = split (/</,$fin);
($fin) = split (/\(/,$fin);
($fin) = split (/\)/,$fin);
($fin) = split (/\[/,$fin);
($fin) = split (/\]/,$fin);
($fin) = split (/\,/,$fin);


$ficout="sortie.txt" ;
open OUTPUT, ">>","$ficout" ;
print OUTPUT "http$fin \n" ;
close OUTPUT ;

$laligne = substr($laligne,$position+2);

}
}
 
  • J’aime
Réactions: daffyb
Bonjour,

Je t‘ai écris un petit applescript qui permet de lancer le script “perl” sans avoir à passer par le terminal..
Le script "perl" ci-dessous à été adapté pour çà . Il suffit qu’il soit exécutable (rendu exécutable avec chmod …)
Au lancement le script applescript te demande de sélectionner le fichier à traiter, puis il te demande de sélectionner le script “perl”.
Il crée un dossier sur le bureau avec le nom “sortie_fichiers_URL_Nom du fichier traité” qui contiendra le fichier texte “sortie.txt”, à la fin il te met un message comme quoi il a terminé.

le perl:
Bloc de code:
#!/usr/bin/perl

#La sortie

while(my $lig = <>) {
chomp($lig);

$lig = lc ($lig);
next if $lig !~ /http/ ;

$|=1 ;

$mot = "http";
$nb = () = $lig =~ /($mot)/g;
$position = index($lig,$mot);

#nouvelle variable pour boucle
$laligne = $lig;
for (my $i = 1; $i <= $nb; $i++) {
 
$lig = lc ($lig);
$position = index($laligne,$mot);

($l,$suite) = split(/http/,$laligne);
($fin) = split (/ /,$suite);
($fin) = split (/>/,$fin);
($fin) = split (/"/,$fin);
($fin) = split (/</,$fin);
($fin) = split (/\(/,$fin);
($fin) = split (/\)/,$fin);
($fin) = split (/\[/,$fin);
($fin) = split (/\]/,$fin);
($fin) = split (/\,/,$fin);


$ficout=$b."sortie.txt" ;
open OUTPUT, ">>","$ficout" ;
print OUTPUT "http$fin \n" ;
close OUTPUT ;

$laligne = substr($laligne,$position+2);

}
}

le script applescript
Bloc de code:
tell application "Finder"
    set lefichier to choose file with prompt "Sélectionnez le fichier texte à traiter"
    set lescript to choose file with prompt "Sélectionnez le script perl pour extraire par pays"
    set f to (quoted form of POSIX path of lefichier) as string
    set s to (quoted form of POSIX path of lescript) as string
   
    set chemin to (path to desktop folder) as string
    set monfichier to name of lefichier
    set lenom to "sortie_fichiers_URL_" & monfichier
   
    make new folder at chemin with properties {name:lenom}
   
    set utilisateur to get short user name of (system info)
   
    set guil to (ASCII character 34)
    set ats to (ASCII character 92)
   
    set lacommande to "sed -i " & guil & guil & " -e " & guil & "s/#La sortie/" & ats & "$b = " & ats & guil & ats & "/Users" & ats & "/" & utilisateur & ats & "/desktop" & ats & "/" & lenom & ats & "/" & ats & guil & ";/g" & guil & " " & s
   
    do shell script lacommande
   
    do shell script "cat " & f & " | " & s
   
    set lacommande to "sed -i " & guil & guil & " -e " & guil & "s/" & ats & "$b = " & ats & guil & ats & "/Users" & ats & "/" & utilisateur & ats & "/desktop" & ats & "/" & lenom & ats & "/" & ats & guil & ";" & "/#La sortie/g" & guil & " " & s
    do shell script lacommande
   
    set fin to current date
    display dialog "Extraction URLs terminée"
end tell
 
Oups !

Un copier coller n'a pas été modifié dans l'applescript.
Cela n'empêche pas le fonctionnement, mais change le texte de la demande de sélection.

Remplace la troisième ligne
set lescript to choose file with prompt "Sélectionnez le script perl pour extraire par pays"
par
Bloc de code:
set lescript to choose file with prompt "Sélectionnez le script perl pour extraire les URLs"
 
Bonjour,
As tu eu le temps de tester?
Quel résultat?