Création d'une mailing list

Bonjour à tous

Je ne sais pas si je poste au bon endroit, ce n’est pas tout à fait de la programmation, mais c’est la section qui m’a parue la plus adaptée à mon problème.

Il faut que je crée une mailing list pour une asso.Je dispose pour cela de plusieurs fichiers d’adhérents (fichiers_adherent_global et fichier_adherent_courant) sous cette forme :

"Noms1";"Prenoms1";"mail1" "Noms2";"Prenoms2";"mail2" ... "NomsN";"PrenomsN";"mailN"
Sachant que certaines lignes ne comportent pas de mail, je dois créer une mailing list de tous les adhérents moins ceux de l’année en cours.Là où ça coince c’est que nous avons environ 130 à 150 adhérents chaques années, je me vois mal faire tous ça à la main et c’est d’ailleurs pour cette raison que je me suis proposé de faire ce boulot : je me suis dis que des outils tel que grep awk sed ou autres pouvaient m’aider dans cette tache longue et fastidieuse.Seulement après avoir lu et relu les différentes manpages j’ai du me rendre à l’évidence : l’exercice est trop dur pour moi qui n’a jamais u à utiliser ces outils.
C’est pourquoi je m’en remet à vous.Je ne sais pas comment je dois m’y prendre.Si quelqu’un parmi vous pouvait m’aider ce serait très sympa car comme je l’ai dis je me vois mal vérifier tout seul près de 600 entrées :confused:

Merci d’avance :slightly_smiling:

tu dipose d’un fichier par année ?

Le fichier final doit être formatté comment ?

En fait j’ai un fichiers avec tous les adhérents depuis plusieurs années (fichier1), à cela s’ajoute un autre fichiers contenant les adhérents de l’année en cours (fichier2).Le but étant d’envoyer un mail à tous ceux qui ne sont plus adhérents (les mails du fichier1 moins les mails du fichier2).L’idéal serait d’envoyer le résultat dans un fichiers de cette forme:mail1;mail2;mail3;...;mailN

Voila un petit script perl développé à l’arrache :

#!/usr/bin/perl -w

use strict;

my $file1 = $ARGV[0];
my $file2 = $ARGV[1];

my @mails;
my @mails1;
my @mails2;

open (FILE1, '<', $file1);
while (<FILE1>)
{
	chomp ($_);
	my @tmp = split(/;/,$_);
	$tmp[2]=~s/"(.*)"/$1/;
	push(@mails1,$tmp[2]);
}
close (FILE1);

open (FILE2, '<', $file2);
while (<FILE2>)
{
	chomp ($_);
	my @tmp = split(/;/,$_);
	$tmp[2]=~s/"(.*)"/$1/;
	push(@mails2,$tmp[2]);
}
close (FILE2);

foreach (@mails1)
{
	my $find = 0;
	my $mail1 = $_;
	foreach(@mails2)
	{
		if ($mail1 eq $_)
		{
			$find = 1;
		}
	}
	if ($find eq 0)
	{
		push (@mails, $_);
	}
}

foreach (@mails)
{
	print $_;
	print ";";
}
print "\n";

usage :

Le fichier “file1” contient tous les adhérents, le fichier “file2” les adhérents à exclure. la liste des mails sort dans le fichier mailinglist.

Merci beaucoup :smiley: .Je ne pensais pas qu’il fallait allé jusqu’à écrire un script pour faire ça.Je regarde ça ce soir et je te retiens au courant.

Bon j’ai testé en vitesse et ça ne marche pas trop :confused: Le fichier de sortie est vide et il me sors une série d’erreurs

Use of uninitialized value in substitution (s///) at ./make_mailing_list.perl line 17, <FILE1> line 5. Use of uninitialized value in substitution (s///) at ./make_mailing_list.perl line 17, <FILE1> line 15. Use of uninitialized value in substitution (s///) at ./make_mailing_list.perl line 17, <FILE1> line 21. Use of uninitialized value in substitution (s///) at ./make_mailing_list.perl line 27, <FILE2> line 117. Use of uninitialized value in string eq at ./make_mailing_list.perl line 38. Sachant qu’il me sors la dernière ligne autant de fois qu’il y a de mail (en tout cas ça y ressemble)
Pour les 4 premières je ne sais pas trop d’où vient le problème.J’ai regardé pour la dernière et il m’a semblé qu’il manquait un “s” à la ligne 38.J’ai remplacé if ($mail1 eq $_) par if ($mails1 eq $_)
Seulement quand je le lance j’ai cette erreur

Global symbol "$mails1" requires explicit package name at ./make_mailing_list.perl line 38. Execution of ./make_mailing_list.perl aborted due to compilation errors. :cry: :cry: :cry:
Je suis loin d’être un spécialiste en perl (ou en tout autre langage) mais je pense au moins avoir compris que la manip que j’ai faite loin d’etre bonne, du coup j’ai remis les choses en états…Au moins le script se lance :laughing:
Merci beaucoup pour ton aide :smiley:

$ grep “@” fichier1 | sed -e ‘1,$s/.;([^;]$)/\1/’ > mail1

te fait un fichier des mails de fichier1

$ grep “@” fichier2 | sed -e ‘1,$s/.;([^;]$)/\1/’ > mail2

te fait un fichiers des mails de fichiers2

#!/bin/sh
if ! grep -q $1 mail2 ; then
echo $1
fi

affiche l’argument que si il n’est pas dans mail2

et donc si ce fichier s’appelle selecte
$ cat mail1 | xargs -n 1 ./selecte

te fait ta liste. Mais c’est à la louche et en ayant oublié la syntatxe de cut (d’où le sed du début). Et puis c’est du rustique.

Yoshi, le script marche très bien chez moi avec :
file 1 :

"Nom1";"Prenom1";"mail1"
"Nom2";"Prenom2";"mail2"
"Nom3";"Prenom3";"mail3"
"Nom4";"Prenom4";"mail4"
"Nom5";"Prenom5";"mail5"

file 2 :

"Nom5";"Prenom5";"mail5"
"Nom3";"Prenom3";"mail3"

Tu es sure qu’il y a des guillemets dans ton fichier ?

Toutes mes excuses :blush: effectivement ton script marche tres bien.Je ne sais pas comment je me suis débrouillé hier soir mais ça ne voulais pas fonctionner.
Sinon fran.b ta méthode fonctionne aussi mais elle me sors un mail par ligne.Enfin c’est pas trop génant puisque de toutes façon j’ai ma mailing list.
Je vais quand même essayer de refaire tout ça moi-même, ça me fera un petit exercice :wink:

Merci pour tout :smiley:

De rien, si tu as des questions sur mon script n’hésites pas , ou des modifications à apporter.

Le Perl c’est assez simple, pour faire des scripts c’est la régale ^^

Tu «pipe» le tout par | awk ‘{TOTO=TOTO";"$1} END {print TOTO}’

dpkg --purge perl

:slightly_smiling:

Pourquoi tant de haine ed ? :neutral_face:

Peut etre parce que ce langage est trop permissif?(enfin il parait j’y connais rien à la programmation)
Sinon je vais regarder ton script, il a l’air lisible et je pense qu’avec une doc sur le perl j’arriverai à comprendre comment tu as raisonné (c’est surtout ça qu’il me manque:l’algorithmique).