tri adresse mail selon extension pays

francois_francois

Membre confirmé
6 Août 2022
57
1
53
Bonjour,

J'ai un dossier contenant des fichiers textes contenant des tonnes d'email d'un grand nombre de pays.

Chaque email est sur une ligne. le format ressemble a "[email protected]:diverscaracteres" ( xx peut etre soit fr, be, it, com, etc, etc...)
A NOTER : le separateur en l'adresse mail et le "diverscarateres" peut etre soit ":" ou ";" ou "TAB" ou "ESPACE".

[email protected]:diverscaracteres
[email protected];diverscaracteres
[email protected] "TABULATION" diverscaracteres
[email protected] "ESPACE" diverscaracteres

J'ai peu de connaissance avec les commandes du terminal, j'ai recuperé les commandes sed sur le net et adapté comme j'ai pu.

  • Dans le terminal je fais CD "mondossierousetrouvelesfichierstextecontenanlesemails"
  • J'ai bien la commande pour extraire les emails en ".be" du fichier source puis sauvegarder dans un fichier texte.
Bloc de code:
 sed -n "/@.*\.be[: ;, ]/p" *.txt > /fichieravecemailBE.txt

Comment faire pour extraire les emails, mais sauvegarder les .be dans un fichier BE.TXT, les .fr dans un fichier FR.txt, les .it dans IT.TXT, etc...., en 1 seul passe ?

Actuellement le tri se fait pays par pays, vu la quantité d'emails a traiter, 1 seul pays me prend au moins 5 heures.

la liste des extension a trier (35 differents)
.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

Je ne sais meme pas si ma requete est possible.

Merci
 
Lit chaque mail, extrait le XX et déplace le dans un dossier XX (ou ajouté le dans un fichier avec la variable XX)
c’est trié en une seule passe
 
Dernière édition:
Bonjour,
C'est un peu difficile de t'aider tout en se demandant si cette base d'email est bien légitime :(
 
Lit chaque mail, extrait le XX et déplace le dans un dossier XX (ou ajouté le dans un fichier avec la variable XX)
c’est trié en une seule passe
oui c'est ce que je veux faire.

le probleme reste quelle est la syntaxe pour faire ca.

Y' a surement une petite astuce de code a ajouter. Je peux pas inviter ce que je connais pas
 
Dernière édition:
Je recolte des listes emails public sur net via un logiciel dedié, c'est illegal ?
En général oui. Pour les emails européen, leur simple conservation tombe sous le coup du GDPR et tu dois obtenir le consentement explicite du propriétaire. Pour la plupart des autres pays c'est l'utilisation pour envoyer des mails non sollicités qui est interdite.
 
Je recolte les mails en vue de statistiques.
Pas d'envoi a quiconque, c'est pour ce que je dois les trier, par pays dans des fichiers texte.
Pour les emails Européen il faut les anonymiser avant de les stocker, tu n'as qu'à faire un hash de la partie avant l'@

Bon je dis ça, mais en même temps si tu avais d'autres buts tu n'en parlerais pas ;)
 
Ces statitisques sont faites dans le cadre privé, sans divulgation, pret, vente, partage, donation, utilisation, contacte.
C'est ce que l'on appelle du "OnlyForMyEyes".

Classer les mails par pays dans un fichier texte dédié pour chacun, permet BEAUCOUP plus facilement de retirer les doublons, les trier par ordre croissant, decroissant, etc.... (meme si l'on peut faire ses operations en ligne de commande). Je prefere voir le resultat directement dans BBEDIT.

Autre avantage, ouvrir des fichiers texte, de petites tailles est plus facile qu'un gros fichier.
 
Dernière édition:
Bonjour,
Dans un fichier "t.pl" que l'on met dans le même répertoire que celui où se trouve le fichier avec les mails :
#!/usr/bin/perl
while(my $lig = <>) {
chomp($lig) ;

($deb,$l,$suite) = split(/[\.:; ]/,$lig);
$ficout=$l.".txt" ;
open OUTPUT, ">>","$ficout" ;
$|=1 ;
print OUTPUT "$lig\n" ;
close OUTPUT ;
}
Au niveau du split, il y a un espace et une tabulation
Ensuite faire :
chmod a+x t.pl
puis,
cat fichierDesMails | ./t.pl
on doit retrouver les mail de .fr dans fr.txt, .com dans com.txt, etc...
Sinon, merci de m'avoir rappelé ma jeunesse ....
 
@jcezanna54

Merci de ton support,

C'est bien plus compliqué que ma ligne sed. Je n'aurais jamais trouvé.

Je vais tester, je reviens vers toi pour t'informer de ce que ca donne.

Merci

CDLT,

---------------
MAJ :

Je viens de tester.
Ton script créé un fichier avec le nom de domaine (hotmail, gmail, yahoo, etc...) puis insere les mails gmail dans le fichier gmail.txt, yahoo dans yahoo.txt , etc...

Je souhaite plus simple que ca, que les mails avec extension @tartanpion.fr (gmail.fr, yahoo.fr, XXXX.fr, etc... soient regroupé dans un fichier texte .FR

Je met 2 photos ecrans pour bien expliquer mon propos.

merci
 

Fichiers joints

  • ttttt copie.jpg
    ttttt copie.jpg
    96,8 KB · Affichages: 55
  • aaaaa copie.jpg
    aaaaa copie.jpg
    99,7 KB · Affichages: 73
Bonjour,

J'ai créé mon script et je l'ai testé à partir des 4 lignes d'exemples données dans ton premier messages en remplaçant les xx par des fr, at et autres com pour créer des fichiers fr.txt, at.txt

$ cat data ; ls *.txt
[email protected]:diverscaracteres
[email protected];diverscaracteres
[email protected] diverscaracteres
[email protected] diverscaracteres
at.txt be.txt com.txt fr.txt
$ for f in *.txt
do
echo ----------------- $f
cat $f
done
----------------- at.txt
[email protected] diverscaracteres
----------------- be.txt
[email protected];diverscaracteres
----------------- com.txt
[email protected] diverscaracteres
----------------- fr.txt
[email protected]:diverscaracteres
Apparemment, il y a une incompréhension, soit dans la description des données en entrée, soit dans le résultat voulu en sortiece que semble indiquer ta deuxième image puisque le nom des fichiers semble contenir plus de caractères que le simple nom de la localisation, ou sans doute les 2.
cette même 2ème image est contraire à ce que tu demandes dans ton premier message :
Comment faire pour extraire les emails, mais sauvegarder les .be dans un fichier BE.TXT, les .fr dans un fichier FR.txt, les .it dans IT.TXT, etc...., en 1 seul passe ?
Il faudrait donc que tu réfléchisses :
1) à bien décrire tes entrées (qui semblent donc différentes de l'exemple donné puisque produisant une sortie différente de celle que j'observe)
2) à bien décrire ce que tu veux en sortie
Cordialement,
 
@jcezanna54

Merci de ton retour,

Je recommence une explication plus détaillée de ma requête, qui etait confuse.

1) J'ai un dossier qui contient plusieurs fichiers texte de très grande taille.
2) chaque fichier texte de ce dossier, contient des dizaines de milliers de lignes
3) chaque ligne contient une adresse mail au format suivant [email protected]:autretexte
=> entre l'extension et autretexte, il y a soit ":" "," ";" "TAB" "ESPACE"

4) l'extension des mails est l'une de ceux de 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

Pour l'exemple, ci dessous un court extrait d'une liste de mails (ou certaines informations ont été remplacées par "test" "chance", afin de rester anonyme)
Pour faire simple les extensions des mails sont limités .li, .dz, .fi, .va, .mc, .lu, .is, .ee .si

https://anonfiles.com/maeeE529ye/listemails_txt

5) une fois extrait, tous les mails qui se trouve dans le fichier listemails.txt avec extension ".li" devront se trouver dans un fichier texte LI_pays.txt
5) une fois extrait, tous les mails qui se trouve dans le fichier listemails.txt avec extension ".dz" devront se trouver dans un fichier texte DZ_pays.txt
5) une fois extrait, tous les mails qui se trouve dans le fichier listemails.txt avec extension ".fi" devront se trouver dans un fichier texte FI_pays.txt
ainsi de suite pour toutes les extensions citées au N°4

CDLT,

:)
 
Dernière édition:
Bonjour,
@francois_francois

Je t'ai écrit un petit applescript qui devrait faire ce que tu demandes.
c'est plus long que les scripts dans le terminal, mais bon...
pour utiliser ce script:
Ouvrir l’application “Editeur de script” qui est dans Application—>Utilitaires
Choisir le bouton en bas à gauche “Nouveau document”, dans la fenêtre qui s’ouvre faire un copier-coller du script.
Cliquer sur le bouton en haut à gauche “Exécuter”

Le script te demande de choisir le fichier "listemail.txt" à traiter, puis il te demande de choisir un dossier destiné à récupérer les fichiers textes générés(un par pays) qui seront nommés avec (l'extension) du pays.txt.

Il te met un message lorsqu'il a terminé.

Dis moi si cela te convient ou s'il faut modifier quelque chose.

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"

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 separ to {":", ";", ",", " ", "    "}
set nbligne to count of paragraph of vartoto

repeat with j from 1 to nbligne
    set laligne to paragraph j of vartoto as string
    set AppleScript's text item delimiters to "@"
    set suite to text item 2 of laligne as string -- 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
            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 repeat

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
 
Bonsoir,

Avec les explications nécessaires, c'est plus clair !
Pour traiter un fichier de mails en une seule passe :

#!/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) ;

($l,$suite) = split(/[:; ]/,$lig);
$code = (reverse(split(/\./,$l)))[0] ;
$p=$pays{$code} ;
$ficout=$code."_".$p.".txt" ;
open OUTPUT, ">>","$ficout" ;
$|=1 ;
print OUTPUT "$lig\n" ;
close OUTPUT ;
}
le fichier listemails.txt étant renommé en listemails.data pour des raisons pratiques,
avec la commande
$ cat listemails.data | ./t.pl
Sinon, pour traiter tous les fichiers en une seule passe on peut faire "cat mails | ./t.pl" en utilisant la génération de noms de fichier avec la caractère "" ou une combinaison...
Mais pour ce fichier, on obtient donc :
$ ls
dz_Algerie.txt il_Israel.txt listemails.data si_Slovenie.txt
ee_Estonie.txt is_Islande.txt lu_Luxembourg.txt t.pl
fi_Finlande.txt li_Liechtenstein.txt mc_Monaco.txt va_Vatican.txt
$ cat va_Vatican.txt
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
[email protected]:chance
pour compléter la liste des pays, voir : liste des code internet

Bonne chance

NB: pour me simplifier la vie, j'ai enlevé les accents dans les noms de pays.
 
Bonjour,
@francois_francois

Je t'ai écrit un petit applescript qui devrait faire ce que tu demandes.
c'est plus long que les scripts dans le terminal, mais bon...
pour utiliser ce script:
Ouvrir l’application “Editeur de script” qui est dans Application—>Utilitaires
Choisir le bouton en bas à gauche “Nouveau document”, dans la fenêtre qui s’ouvre faire un copier-coller du script.
Cliquer sur le bouton en haut à gauche “Exécuter”

Le script te demande de choisir le fichier "listemail.txt" à traiter, puis il te demande de choisir un dossier destiné à récupérer les fichiers textes générés(un par pays) qui seront nommés avec (l'extension) du pays.txt.

Il te met un message lorsqu'il a terminé.

Dis moi si cela te convient ou s'il faut modifier quelque chose.

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"

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 separ to {":", ";", ",", " ", "    "}
set nbligne to count of paragraph of vartoto

repeat with j from 1 to nbligne
    set laligne to paragraph j of vartoto as string
    set AppleScript's text item delimiters to "@"
    set suite to text item 2 of laligne as string -- 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
            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 repeat

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
Bonjour Zeltron54

Merci de me proposer ton aide.
Je vais tester egalement ton travail.

C'esst d'autant plus intéréssant que l'on va pouvoir comparer la vitesse d'execution de ton script et celui de jcezanna54.

Pour un resultat significatif du temps d'execution, je vais traiter un fichier texte de 2 gigas.

Je reviens vers toi, après essai.

Merci

CDLT
 
Dernière édition:
bonjour,

Je n'ai aucune compétence en applescript, mais il me semble :
1) que le cas du nom du pays en clair n'est pas traité
2) que le informations essentielles du traitement sont demandées en interactif, cee qui rend difficile l'automatisation pour une comparaison des temps d'exécution
3) que le fichier est lu en mémoire, ce qui est aussi possible en perl mais que je n'ai pas fait par souci de simplification
4) qu'il n'est pas possible de traiter l'ensemble des fichiers de données en 1 seule passe

Enfin, la commande "times" peut t'aider dans tes comparaisons

dans l'attente de tes résultats