1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281
| #!/usr/local/bin/perl -w
use strict;
#initialisation des variables de question
my $finData="f2 backcross" ;
my $aliasC="1=H 0=A" ;
my $unique=-1 ;
my $transpo=-1 ;
my $okey=0 ;
my $choix = "" ;
my $valider = "" ;
my $hard_chomp ;
#on se place dans le répertoire que l'utilisateur utilise pour plus de simplicité
my $pwd=`pwd`;
chdir($pwd);
system (clear);
#info puis première question à l'utilisateur
print " __________________________________________________\n\n";
print " versCarthagene_mod\n";
print " __________________________________________________\n\n\n";
print "Formatez bien votre fichier excel avant\nde le passer en fichier texte pour le programme,\nPas de cellules fusionnées !\nEt surtout PAS de tabulation dans les noms de marqueurs\n";
print "\nEntrez le nom du repertoire contenant le(s) fichier(s) à formater :\n" ;
chomp(my $repertoire=<STDIN>) ;
#deuxieme question
system (clear);
print "\nNom de votre répertoire qui va contenir le(s) fichier(s) resultat(s) :\n" ;
chomp (my $nomRep = <STDIN>) ;
mkdir "$nomRep", 0777 or warn "Impossible de créer le répertoire : $nomRep (si il existe déjà il n'y auras pas de problèmes)\n" ;
#boucle pour déterminer si le fichier nécéssite une transposition [question 3]
while (!$okey)
{
print "\nComment est(sont) constitué(s) votre(vos) fichier(s) ?\nAvec les noms des marqueurs en haut de colones ?\nOu bien avec les noms de marqueurs en débuts de lignes ? :\n\nattention TOUT vos fichiers serons traités de la même manière\n\n\nLigne ? Colone ?\n" ;
chomp ($choix = <STDIN>) ;
if ($choix=~/^c/i)
{
$transpo=1;
$okey=1;
}
elsif ($choix=~/^l/i)
{
$transpo=0;
$okey=1;
}
else
{
print "\réponse incorecte\n";
}
}
#boucle pour déterminer si un ou plusieurs fichier de sorties serons générez [question 4]
system (clear);
$okey=0;
while (!$okey)
{
print "\nSi vous avez plusieurs fichiers d'entrées, souhaitez vous qu'il soient compilés en un seul fichier pour carthagene ? :\nOui ? Non ?\n" ;
chomp ($choix = <STDIN>) ;
if ($choix=~/^o/i)
{
$unique=1;
$okey=1;
print "\nLe fichier de résultat s'appellera Resultats_Compilees_Carthagen.cg\nappuyez sur entrer pour continuer";
$valider = <STDIN> ;
}
elsif ($choix=~/^n/i)
{
$unique=0;
$okey=1;
}
else
{
print "\réponse incorecte\n";
}
}
#boucle pour personaliser la ligne d'entete des fiches de sortie (data type ....) [question 5]
system (clear);
$okey=0;
while (!$okey)
{
print "\nVoulez-vous personnaliser la fin de la première ligne des fichiers générés ?\nPar defaut cette ligne est \"data type f2 backcross\"\nOui ? Non ?\n";
chomp ($choix = <STDIN>) ;
if ($choix=~/^o/i)
{
$okey=1;
print "\nEntrez la fin de la ligne (correspondant à \"f2 backcross\" dans l'exemple ci-dessu)\n";
chomp ($finData = <STDIN>) ;
print "\n donc la première ligne de votre(vos) fichier(s) seras : \n\ndata type $finData\n\nappuyez sur entrer pour continuer";
$valider = <STDIN> ;
}
elsif ($choix=~/^n/i)
{
$okey=1;
}
else
{
print "\réponse incorrecte\n";
}
}
#boucle pour personaliser la 2iem ligne d'entete des fiches de sortie (avec les alias carthagene) [question 6]
system (clear);
$okey=0;
while (!$okey)
{
print "\nVoulez vous personnaliser la fin de la deuxième ligne des fichiers générés ?\nPar defaut cette ligne est \"<nombre d'individus> <nombre de marquers> 0 0 1=H 0=A\"\nOui ? Non ?\n";
chomp ($choix = <STDIN>) ;
if ($choix=~/^o/i)
{
$okey=1;
print "\nEntrez la fin de la ligne (correspondant aux alias de carthagene c'est à dire à \"1=H 0=A\" dans l'exemple ci-dessu)\n";
chomp ($aliasC = <STDIN>) ;
print "\n donc la deuxième ligne de votre(vos) fichier(s) seras : \n\nX Y 0 0 $aliasC\nX sera un chiffre représentant le nombre d'individu et Y le nombre de marqueurs\nappuyez sur entrer pour continuer";
$valider = <STDIN> ;
}
elsif ($choix=~/^n/i)
{
$okey=1;
}
else
{
print "\réponse incorrecte\n";
}
}
system (clear);
#---------------- ----------------
# ----------------
# ---------------- traitement des fichier ----------------
# ----------------
# ---------------- ----------------
#ouverture du répertoire ou se trouvent les fichiers à traiter
opendir (my $DIR, $repertoire) or die "Impossible d'ouvrir le repertoire contant le fichier à traiter ($repertoire)\nFin de programme\n" ;
print "début du traitement\n";
#initialisation des variables pour le traitement de fichier
my @nom = () ;
my @donnees = () ;
my @bad =() ;
my $lineTitre = 1 ;
my $file;
my @TDeT = () ;
my $comptLigne = -1 ; #car on commence par la ligne titre qui est la ligne -1
my $comptChar = 0 ;
#pour chaque fichier dans le repertoire on effectue le traitement suivant
foreach $file (readdir $DIR)
{
#si le "fichier" est . ou .. on passe au suivant
#(car se ne sont pas de véritables fichier mais en fait les addresses des dossier ou l'on se trouve et du dossier supérieur)
next if $file eq "." or $file eq ".." ;
#ouverture du fichier courant
open(my $FILE,"$repertoire/$file") || die "Impossible d'ouvrir le fichier : $repertoire\/$file\n" ;
while(<$FILE>)
#pour chaque ligne on effectue le traitement suivant
{
#si le fichier est déjà à l'horizontal [lignes]
if (!$transpo)
{
#on mémorise le nom de chaque marqueur
if(/\t/)
{
#on le stock dans une liste (@nom)
push(@nom,$`) ;
my $tmp = $'; #variable qui nous permet de stocker la fin de ligne et de la modifier.
#et on mémorises les information relative au marqueur dans une seconde liste (@donnees)
if ($tmp=~ s/\t//g)
{
push(@donnees, $tmp) ;
chomp($donnees[-1]);
}
}
}
#si non c'est que le fichier est à la verticale [Colonnes]
else
{
#on est sur une nouvelle ligne on réinitialise donc la valeur du compteur de caractères
$comptChar = 0 ;
#si on est sur la ligne titre
if($lineTitre)
{
#on mémorise le nom de chaque marqueur dans une liste (@nom)
while (/\t/)
{
push(@nom,$`) ;
$_ = $';
}
#pour récupérer la derniere colonne (ici le dernier nom)
$hard_chomp = $_ ;
chomp($hard_chomp) ;
push(@nom,$hard_chomp) ;#on chomp pour ne pas prendre le retoure à la ligne de la fin
$lineTitre = 0 ; #on signale que la ligne titre à été traiter
}
#si on est pas au niveau de la ligne titre
else
{
while (/\t/)
{
#on stock dans un tableau de tableau (@TDeT) chaque caractère avec comme premier indice
#celui qui correspont à l'indice du nom sous lequelle il se trouve
#et second indice correspondant à la ligne
$TDeT[$comptChar][$comptLigne]=$` ;
$_ = $'; # on enleve le carctère que l'on vien d'inserer dans le tableau de la variable $_
$comptChar ++ ;
}
#pour récupérer la derniere colone (ici le dernier chiffre)
$hard_chomp = $_ ;
chomp($hard_chomp) ;
$TDeT[$comptChar][$comptLigne]=$hard_chomp ; #on chomp pour ne pas prendre le retoure à la ligne de la fin
}
$comptLigne ++ ; # ici on signale qu'on à finit de traiter la ligne en cours
}
}
#on ferme le fichier une fois que on as finit de le traiter
close($FILE);
#si on as un fichier d'entrer en colonne alors on concatène le résultat
#du tableau de tableau dans le tableau de donnees
if ($transpo)
{
my @Nvlldon = map ( {join("",@{$_} ) ; } @TDeT ) ;
@donnees = (@donnees,@Nvlldon) ;
}
#si on veut plusieurs fichiers de sorties alors
if (!$unique)
{
#on suprime le .txt du nom du fichier d'origine
$file =~ s/\.txt// ;
#et on lance la sous routine sortie
sortie($file,@donnees);
#réinitialisation des variables pour que le prochain fichier à traiter n'ai pas les données du précédent
@nom = () ;
@donnees = () ;
@TDeT = () ;
$comptLigne = 0 ;
$comptChar = 0 ;
}
}
closedir ($DIR) ;
#on ferme le repertoire des fichier à traiter
#si on veut un seul fichier de sortie alors on le genèrer en dehor de la boucle
if ($unique)
{
#et on execute la sous routine sortie avec en paramatre le nom
#du fichier de résultats compilés et le tableau de données
sortie("Resultats_Compilees_Carthagen",@donnees);
}
#message de fin du programme
print "\nFormatage terminé\n";
#---------------- ----------------
# ----------------
# ---------------- Sous routines ----------------
# ----------------
# ---------------- ----------------
#
#écriture de fichiers
sub sortie
{
#on récupere le nom du fichier de sortie
my ($file,@donnees) = @_ ;
#initialisation de la variable du nb de marqueurs
my $nbMarqueurs = @nom ;
my $nbIndividus = length($donnees[0]) ;
#ouverture du fichier de sortie
open(my $OUT,">>$nomRep/$file.cg") || die "Impossible de trouver ou creer le fichier $nomRep\/$file.cg\n" ;
#écriture des 2 lignes d'entête.
print $OUT "data type $finData\n" ;
print $OUT "$nbIndividus $nbMarqueurs 0 0 $aliasC\n" ;
#boucle qui va écrire le fichier de sortie
my $i = 0 ;
while($i<=$#nom)
{
print $OUT "$nom[$i]\t" ;
print $OUT "$donnees[$i]\n" ;
$i ++ ;
}
close($OUT);
} |
Partager