tri adresse mail selon extension pays

Bonjour,
@jcezanna54

Je ne connait pas le langage perl !
effectivement je n'ai pas traité le nom du pays en clair.
J'avais fait ce script, avant que tu ne modifies le tien, qui je n'en doute pas sera beaucoup plus rapide, donc le mien n'a plus lieu d'être !
Francois_francois va faire ces essais et verra bien...

En tout cas merci pour ton retour. :up:
 
Avec ces seules infos, il m'est difficile de trouvé l'erreur !
A priori il ne trouve pas le fichier
Bloc de code:
SSD525:Users:xxx:Desktop:TEST2:241OMEGAS_UNIQ_NO_RU.txt

Que représente ce fichier, une liste de mails ?

Edit: j'ai fait un essai sur ton fichier test, pas de problème
 
Dernière édition:
@jcezanna54

J' ai lancé le t.pl a 9H00, je suis revenu chez moi a 15H00, tout semble traité (fichier de 2 gigas).
Ca fait le boulot.

Peut être une chose a revoir,

Serait-il possible d'exclure du traitement les mails qui ont l'un ou l'autre (ou les 2) criteres suivants :

• les emails malformés (dont il manque une partie pour former une adresse mail valide)
• les emails dont l'extension ne fait pas partie de la liste des extensions souhaitées ci dessous
(.at .ba .be .bg .ca .ch .cl .cz .dk .dz .ee .edu .es .eu .fi .fr .uk .gr .hu .ie .il .is .it .li .lu .mc .nl .pl .pt .se .si .va .net .org .com )

==========================================
exemple d'emails qui ont été sauvegardés dans un fichier texte.

[email protected]:chance <= il manque le "." avant com
[email protected]:chance <= ".hik" n'est pas une extension de la liste des extensions.
[email protected]:chance <= ".hinenet" n'est pas une extension de la liste des extensions.
[email protected]:chance <= apres ".com", ce n'est ni "," ou ";" ou "espace" ou "TAB"
==========================================

Pour le test, nous avons choisi d'extraire 10 pays, le script l'a bien fait, mais il a aussi extrait les mails mals formés ou l'extension n'es pas dans la liste des extensions rexcherchés.

Du coup, au lieu d'avoir seulement les 10 fichiers texte avec les extensions (dz_Algerie.txt, lu_Luxembourg.txt, il_Israel.txt, etc...) j'ai 6520 fichiers. (voir photo écran)

Si tu souhaites modifier le script (qui sera de fait optimisé, puisque ne traitant que les bonnes extensions, je relancerai un test chronometré cette fois).

Merci des efforts consentis.

CDLT,

:)
 

Fichiers joints

  • bbbbbbbbb.png
    bbbbbbbbb.png
    463,7 KB · Affichages: 36
Avec ces seules infos, il m'est difficile de trouvé l'erreur !
A priori il ne trouve pas le fichier
Bloc de code:
SSD525:Users:xxx:Desktop:TEST2:241OMEGAS_UNIQ_NO_RU.txt

Que représente ce fichier, une liste de mails ?

Edit: j'ai fait un essai sur ton fichier test, pas de problème
oui, j'ai reuni plusieurs fichiers texte. J'avais deja commencé a retirer les mais .ru, .cn, les mails de spammeurs bien connus, etc.., et trié les doublons.
Vu la taille du fichier texte, sous BBedit ca pas evident, c'est lent, ca gel. Je passe par le terminal, c'est assez rapide.

Zeltron, ton script est capable de lire un fichier superieur a 2 gigas ??????
 
Dernière édition:
Ok !
Comme je l'avais dit l'applescript est beaucoup plus lent que le perl !
Donc je laisse @jcezanna54 te faire le boulot ! Bon courage :up: :coucou:
 
En attendant que @jcezanna54 te modifie son script, j'ai modifié le mien.
La seule chose que je n'ai pas traité est le pays en clair.

Peux-tu faire un essai (déjà sur un petit fichier pour test)

Bloc de code:
property lepays : ""
property laligne : ""
property lechemin : ""

set monFichier to choose file with prompt "Sélectionnez le fichier listemail. txt à traiter"
set lechemin to choose folder with prompt "Sélectionnez le dossier pour la réception des fichiers texte par pays"
set monFichier to POSIX path of monFichier

set separ to {":", ";", ",", " ", "    "}
set lextension to {"at", "ba", "be", "bg", "ca", "ch", "cl", "cz", "dk", "dz", "ee", "edu", "es", "eu", "fi", "fr", "uk", "gr", "hu", "ie", "il", "is", "it", "li", "lu", "mc", "nl", "pl", "pt", "se", "si", "va", "net", "org", "com"}
tell application "Finder"
    set nb to do shell script "wc -l < " & monFichier
    set ligne to 1
    repeat
        set commande to "sed -n '" & ligne & "p' " & monFichier
        set laligne to do shell script commande
        
        
        set AppleScript's text item delimiters to "@"
        set suite to text item 2 of laligne -- récupère la ligne 1
        set AppleScript's text item delimiters to ""
        
        set suiteadresse to ""
        set lecar to 1
        repeat
            if item lecar of suite is in separ then
                set suiteadresse to suiteadresse as string
                set lepays to text items (lepoint + 1) thru (lecar - 1) of suiteadresse
                set lepays to lepays as string
                if lepays is in lextension then my ecritligne()
                exit repeat
            else
                set suiteadresse to suiteadresse & item lecar of suite
                if item lecar of suite is "." then set lepoint to lecar
                set lecar to lecar + 1
            end if
        end repeat
        
        set ligne to ligne + 1
        if ligne > nb then exit repeat
    end repeat
end tell

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on ecritligne()
    set ecritdans to lechemin as text
    set ecritdans to ecritdans & lepays & ".txt"
    set lelog to open for access (ecritdans) as text with write permission
    write laligne & return to lelog starting at eof
    close access lelog
end ecritligne
 
  • J’aime
Réactions: francois_francois
Bonjour,
j'avais oublié de traiter 2 cas d'erreur
1 - pas de signe "@" dans la ligne
2 - pas de "." entre "@" et le séparateur
c'est fait !

Pour mettre la pays en clair, je pense qu'il sera plus simple de renommer les 35 fichiers en fin de traitement.
Le traitement d'un deuxième fichier .txt en choisissant le même dossier de destination ajoute les nouvelles lignes aux fichiers existant, ce qui devrait permettre de traiter des fichiers plus petits en les scindant.

Bloc de code:
property lepays : ""
property laligne : ""
property lechemin : ""

set monFichier to choose file with prompt "Sélectionnez le fichier listemail. txt à traiter"
set lechemin to choose folder with prompt "Sélectionnez le dossier pour la réception des fichiers texte par pays"
set monFichier to POSIX path of monFichier

set separ to {":", ";", ",", " ", "    "}
set lextension to {"at", "ba", "be", "bg", "ca", "ch", "cl", "cz", "dk", "dz", "ee", "edu", "es", "eu", "fi", "fr", "uk", "gr", "hu", "ie", "il", "is", "it", "li", "lu", "mc", "nl", "pl", "pt", "se", "si", "va", "net", "org", "com"}
tell application "Finder"
    set nb to do shell script "wc -l < " & monFichier
    set ligne to 1
    repeat
        set commande to "sed -n '" & ligne & "p' " & monFichier
        set laligne to do shell script commande
        
        try
            set AppleScript's text item delimiters to "@"
            set suite to text item 2 of laligne -- récupère la ligne 1
            set AppleScript's text item delimiters to ""
            
            set suiteadresse to ""
            set lecar to 1
            
            repeat
                if item lecar of suite is in separ then
                    set suiteadresse to suiteadresse as string
                    set lepays to text items (lepoint + 1) thru (lecar - 1) of suiteadresse
                    set lepays to lepays as string
                    if lepays is in lextension then my ecritligne()
                    exit repeat
                else
                    set suiteadresse to suiteadresse & item lecar of suite
                    if item lecar of suite is "." then set lepoint to lecar
                    set lecar to lecar + 1
                end if
            end repeat
        end try
        set ligne to ligne + 1
        if ligne > nb then exit repeat
    end repeat
end tell

tell application "Finder"
    activate
    (display dialog ("waouou ... Ca y est c'est fait !") buttons {"Salut !"})
end tell

on ecritligne()
    set ecritdans to lechemin as text
    set ecritdans to ecritdans & lepays & ".txt"
    set lelog to open for access (ecritdans) as text with write permission
    write laligne & return to lelog starting at eof
    close access lelog
end ecritligne
 
  • J’aime
Réactions: francois_francois
Merci de la retouche de ton travail.

Je vais faire un 1er test sur un petit fichier de 123 MEGAS, puis sur le 2 GIGAS.

Merci


MAJ :

1er essai
En 5 minutes, voici la taille des fichiers com.txt, cz.txt, es.txt, net.txt, se.txt, uk.txt, fr.txt, il.txt, que le script a trouvé sur le fichier de 123 MEGAS

zzzzzzzzz.png
soit
342 .com
1 .cz
1 .es
3 .fr
1 .il
12 .net
1 .se
1 .uk





2e essai
Tout pareil, sauf le fichier texte qui est de 2 GIGAS.
ca fonctionne aussi, il crée assez rapidement les fichiers suivants => com.txt, net.txt, pl.txt, et ca continue a fonctionner.


En 5 minutes, voici la taille des fichiers com.txt, net.txt, pl.txt que le script a trouvé sur le fichier de 2 GIGAS
tttttttttt.png
Soit :
41 .com
6 .net
1 .pl

il me semble qu'il trouve bien plus de mails a la seconde avec un fichier de 100 megas, qu'avec le 2 gigas.


En comparaison, le script de @jcezanna54 (qui n'utilise pas le meme langage) travaille plus rapidement (bien qu'il traite aussi des mails parasites).
rrrrrrr.png


En 3 heures :
1,8 Giga de .com
124 Megas de .net
7,4 Megas de .fr
etc...
 
Dernière édition:
C'est certain que le langage "perl" est beaucoup plus rapide que l'applescript.

C'est pour ça que lors de mon premier script je chargeais la totalité du fichier texte en mémoire ram, pour gagner du temps (plus d'accès disque), mais ça n'a pas fonctionné !

Le script analyse toutes les lignes, une par une , en fonction des lignes valides trouvées ce sera plus ou moins long...

Bon si cela fonctionne c'est le principal !...
 
  • J’aime
Réactions: francois_francois
J'ai pas précisé, à la fin du traitement le script affiche un message de fin "waouou ... Ca y est c'est fait !", si ce message n'est pas validé dans les 3 minutes alors une erreur de script est affichée "Erreur dans Finder : Délai dépassé pour un AppleEvent." cela n'a aucune conséquence.
 
  • J’aime
Réactions: francois_francois
@jcezanna54

Si tu veux faire la modification de ton script, tout est indiqué ici :
https://forums.macg.co/threads/tri-adresse-mail-selon-extension-pays.1376005/page-2#post-14275655

Autre chose que je viens de voir, les mails qui ne possede pas @ dans l'adresse sont traités comme mails valides.
j'ai volontairement ajouté un mail avec mauvaise syntaxe, le script l'a reconnu comme valide et ajouté dans la liste des .com
rrrrrrr.png



La j'ai testé ton script sur un fichier de 2 GIGAS, tous se passe ok (sous reserve de faire la modification ci-dessus).
Ton script fonctionnera t-il avec un dossier contenant 15 fichiers texte d'une taille de 11 gigas jusqu'a 135 gigas ?

Merci
 
Dernière édition:
Bonjour,

Mon script fonctionnera avec autant de données que tu veux puisqu'il lit les fichiers ligne à ligne. Ce sera juste une question de temps.
En supposant que tes 15 fichiers aient une extension "data" pour ne pas faire de confusion avec les "txt" qui sont des résultats, tu pourras essayer :
for f in *.data
do
echo "traitement de $f"
cat $f | ./t.pl
done
Et puis, comme je n'ai aucune idée du temps de traitement, tu peux lancer un film ....


J'ai modifié ton fichier de données test en y ajoutant les lignes :
[email protected]:chance

[email protected]:chance
[email protected]:chance
ttestavl.sonatrach.dz:chance
testcmdnet.lu:chance
testdacolux.lu:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance

[email protected]:chance
en y ajoutant des lignes vides pour faire bon poids
le script modifié est le suivant :
#!/usr/bin/perl

# liste des pays à compléter
%pays = (
"li", "Liechtenstein" ,
"dz", "Algerie" ,
"fi", "Finlande",
"va", "Vatican",
"mc", "Monaco" ,
"lu", "Luxembourg" ,
"is", "Islande" ,
"il", "Israel" ,
"ee", "Estonie" ,
"si", "Slovenie"
) ;



while(my $lig = <>) {
chomp($lig) ;
next if $lig !~ /@/ ;
($l,$suite) = split(/[:; ]/,$lig);
$code = (reverse(split(/\./,$l)))[0] ;
$p=$pays{$code} ;
next if length($p) <1 ;
$ficout=$code."_".$p.".txt" ;
open OUTPUT, ">>","$ficout" ;
$|=1 ;
print OUTPUT "$lig\n" ;
close OUTPUT ;
}
les modifications sont simples :
1) ne pas traiter si pas de "@"
2) ne pas traiter si pas dans dans la liste des pays
S'il y a encore d'autres sujets à ne pas traiter, ce serait bien d'en avoir une liste exhaustive, en bref de faire ce que les informaticiens appellent une "analyse" du problème.
Sinon, un expert en perl pourrait aisément trouver des moyens d'améliorer les performances de ce script.
Je l'ai laissé volontairement "simple" pour être lisible et compréhensible par d'autres.
 

@jcezanna54


Merci. J'essai des que possible.

J'ai pas compris ou je dois mettre ces lignes de code ?
soit tu les met dans un fichier t.sh et ensuite dans le terminal tu tapes "sh t.sh" soit tu les tapes directement dans le terminal si tu es certain de ne pas faire d'erreur de frappe...
C'est uniquement pour traiter l'ensemble des fichiers en une seule passe si tu les a renommé avec une extension ".data"
 
  • J’aime
Réactions: francois_francois
soit tu les met dans un fichier t.sh et ensuite dans le terminal tu tapes "sh t.sh" soit tu les tapes directement dans le terminal si tu es certain de ne pas faire d'erreur de frappe...
C'est uniquement pour traiter l'ensemble des fichiers en une seule passe si tu les a renommé avec une extension ".data"
pour tester j'ai mis 2 fichiers texte (.txt) avec des mails dans un dossier

puis fais
cd le_dossier_ou_se_trouve_les_fichiers_texte_avec_mails
cat * | /Users/xxx/Desktop/tversion2.pl
les mails des 2 fichiers ont été extraits et placés dans des fichiers au nom des pays

Est ce que ca pose un probleme d utiliser "cat * | /Users/xxx/Desktop/tversion2.pl" au lieu de ton "sh t.sh" ?

merci
 
Dernière édition:
Resultats du temps d'execution extraction des mails d'un fichier de 2 GIGAS

----------------------------------------------------
DEBUT extraction des mails a : Wed Aug 10 15:23:17 2022
----------------------------------------------------
----------------------------------------------------
FIN extraction des mails a : Wed Aug 10 17:54:44 2022
----------------------------------------------------