PERL_Tri et concaténantion [Fermé]

Signaler
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012
-
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012
-
Bonjour,

J'aimerai concaténer plusieurs fichiers ( dans l'ordre) en utilisant le langage PERL ?

Exemple des fichiers à concaténer :

A_1980_AB11_1001.txt
A_1980_AB11_1003.txt
A_1980_AB11_1002.txt
A_1980_2AB12_1001.txt
A_1980_AB13_1001.txt
A_1980_2AB12_1002.txt


Dans le fichier final, je dois avoir le contenu des fichiers ci-dessous ( et dans l'ordre) :

A_1980_AB11_1001.txt
A_1980_AB11_1002.txt
A_1980_AB11_1003.txt
A_1980_2AB12_1001.txt
A_1980_2AB12_1002.txt
A_1980_AB13_1001.txt

Par avance, je vous remercie pour votre aide.

Amine.

7 réponses

Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Personne pour m'aider :(((
Messages postés
180
Date d'inscription
dimanche 30 janvier 2011
Statut
Membre
Dernière intervention
30 septembre 2012
8
Bonjour,

Si tu veut trier tes fichiers, je pense que la meilleur façons de faire est de lister le contenu de ton dossier avec une fonction et ensuite de les trier toi même.
Une fois que tu les a trié, il ne te reste plus qu'à les ouvrir un par un pour tout entrer dans un seul fichier.

Une fonction pour lister tous les fichiers d'un dossier :
sub listDirectory { 
 my ($repertoire) = @_; 
 my @fichiers = (); 
 opendir (my $rep_fh, $repertoire) or die "impossible d'ouvrir le repertoire $repertoire\n"; 
 my @file_rep = grep { !/^\.\.?$/ } readdir($rep_fh); 
 closedir ($rep_fh); 
 foreach my $nom (@file_rep) { 
  if (-f "$repertoire/$nom") { push (@fichiers, $nom); } 
 } 
 return @fichiers; 
}
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Merci beaucoup pour cette réponse. malheureusement, je ne suis pas un spécialiste du PERL et ne comprends pas l'ensemble de votre programme.

Pour exécuter votre programme, je dois :
- Définir une variable "repertoire" : \\Home\TEST
- Définir la variable "fichiers" ( le répertoire final)

Est-ce que c'est bien ça ?

Encore, je vous remercie beaucoup.

sub listDirectory {
my ($repertoire) = @_;
my @fichiers = ();
opendir (my $rep_fh, $repertoire) or die "impossible d'ouvrir le repertoire $repertoire\n";
my @file_rep = grep { !/^\.\.?$/ } readdir($rep_fh);
closedir ($rep_fh);
foreach my $nom (@file_rep) {
if (-f "$repertoire/$nom") { push (@fichiers, $nom); }
}
return @fichiers;
}
Messages postés
180
Date d'inscription
dimanche 30 janvier 2011
Statut
Membre
Dernière intervention
30 septembre 2012
8
Il suffit de lancer la fonction avec comme ceci :
my $repertoire = "TON DOSSIER";
my @fichiers = &listDirectory($repertoire);

Sachant que la variable $repertoire contient le chemin vers le dossier que tu veut lister.
Ensuite, la fonction va te retourner un tableau (@fichiers) qui contient tous les fichiers du dossier.
Messages postés
759
Date d'inscription
mercredi 17 juin 2009
Statut
Membre
Dernière intervention
29 décembre 2013
125
Salut,

J'ai écrit le code en Python.

J'ai d'abord créé 6 fichiers avec les contenus suivants:

- nom du fichier: AB11_1001
- contenu du fichier:
blablabli
blablabla
contenu du fichier AB11_1001
balablabalablalblabli

- nom du fichier: AB11_1003
- contenu du fichier:
karakako
contenu du fichier AB11_1003
kakakukiko

- nom du fichier: AB11_1002
- contenu du fichier:
dudurududu
contenu du fichier AB11_1002
dododudud

- nom du fichier: 2AB12_1001
- contenu du fichier:
mumumumimimim
contenu du fichier 2AB12_1001
mamamamimummmumim

- nom du fichier: AB13_1001
- contenu du fichier:
xixixixixixixixixi
contenu du fichier AB13_1001
xuxuxuxuuxxuxexexexexe

- nom du fichier: 2AB12_1002
- contenu du fichier:
taratatattat
ttatrotototerottotot
contenu du fichier 2AB12_1002
tttttttaaaaaaratatatatta


Et le code qui crée un fichier cumulatif des contenus de ces fichiers dans un ordre dépendant de leur nom:

from os import listdir 
import re 

regx = re.compile('[_\d]+(?=\.)') 

li = listdir('I:\\Prov Python') 
li.sort(key=lambda x: regx.search(x).group()) 

with open('I:\\Prov Python\\cumul.txt','w') as cumul: 
    for filename in li: 
        with open('I:\\Prov Python\\' + filename,'r') as f: 
            cumul.write(f.read())


Bien sûr, la regex est fonction de ce que j'ai pensé plausible comme critère de tri des noms de fichiers sur la base de seulement 6 noms. Pour d'autres règles, il faudra une regex différente.

Après exécution, j'obtiens le fichier cumul.txt avec le contenu suivant:

blablabli
blablabla
contenu du fichier AB11_1001
balablabalablalblabli

dudurududu
contenu du fichier AB11_1002
dododudud

karakako
contenu du fichier AB11_1003
kakakukiko

mumumumimimim
contenu du fichier 2AB12_1001
mamamamimummmumim

taratatattat
ttatrotototerottotot
contenu du fichier 2AB12_1002
tttttttaaaaaaratatatatta

xixixixixixixixixi
contenu du fichier AB13_1001
xuxuxuxuuxxuxexexexexe




Je sais que tu as parlé de Perl, mais comme tu dis ne pas le connaître, ce n'est peut être que l'objectif qui t'intéresse, sans être attaché à un langage en particulier.
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Je pense que je n'ai pas très bien décris le besoin :
le but est de concatener le contenu des fichiers et à voir un "fichier_concat_final" qui contient le contenu de l'ensemble des fichiers.

Merci encore pour votre aide.
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Merci bcp !

J'ai placé "$_\n"; après la commande ECRIRE, mais j'ai un retour chariot après chaque ligne et ce n'est pas mon souhait. mon souhait est d'avoir un retour chariot comme suit :

fichier1 :

AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBB
CCC

fICHIER2 :

sssssssssss
ddddddddddddddd
ffffffffff

Le fichier final doit être sous format :

AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBB
CCC
sssssssssss
ddddddddddddddd
ffffffffff

et non :

AAAAAAAAAAAAAAAA
BBBBBBBBBBBBBB
CCCsssssssssss
ddddddddddddddd
ffffffffff
Messages postés
180
Date d'inscription
dimanche 30 janvier 2011
Statut
Membre
Dernière intervention
30 septembre 2012
8
Ah oui bien sur, excuse moi ^^
Voila les positions où tu peut ajouter des lignes :
# Ajouter une ligne au début du fichier 
print ECRIRE "Première ligne\n"; 

for(my $i = 0; $i < $lengthFichiers; $i++) { 
 # Ajouter une ligne avant d'avoir lus le fichier 
  print ECRIRE "Avant fichier\n"; 
  my $currentFile = $repertoire . "/" . $fichiers[$i]; 
  open(LIRE, $currentFile) || die ("Erreur d'ouverture de $currentFile"); 
  while(<LIRE>) { 
    print ECRIRE $_; 

   # Ajouter une ligne pendant la lecture du ficheir 
   print ECRIRE "Pendant lecture fichier\n"; 
  } 
  close(LIRE); 

  # Ajouter une ligne après avoir lus le fichier 
  # Dans ton cas, c'est ici que tu veut ajouter ton retour à la ligne ;)
  print ECRIRE "Arpès fichier\n"; 
} 

# Ajouter une ligne à la fin du fichier de sortie 
print ECRIRE "Fin du fichier\n"; 
close(ECRIRE); # Fermeture du flux en écriture
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Merci beaucoup !
Même le tri fonctionne :)
Messages postés
180
Date d'inscription
dimanche 30 janvier 2011
Statut
Membre
Dernière intervention
30 septembre 2012
8
Content d'avoir pu aider ;)
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Again MERCI :)
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

J'ai encore une question :)

Le programme ci-dessus, lit tous les fichiers se trouvant dans "le répertoire". or moi, j'aurai besoin de lire seulement les fichier començant par une chaine de caractères, par exemple : A_2012_*

Merci pour votre retour.
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

parce que je veux cr"er la fonctionne. et l'appeler.
comme ça la prochaine si j'aurais besoin de faire la même chose je ne vais pas écrire tous le code,.. je vais seulement faire la déclaration de la fonction et l'utiliser sous le format suivant :

File_I=chemin/A_2010_*
File_O=
&Concat_file()
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Désolé pour le dérangement, mais dans votre code, la variable $ rep, ne contient rien ?
ou alors je n'ai pas bien compris.

Merci bcp

sub listDirectory {
my ($rep) = @_;
my @fichiers = ();
opendir (my $rep_fh, $rep)
Messages postés
180
Date d'inscription
dimanche 30 janvier 2011
Statut
Membre
Dernière intervention
30 septembre 2012
8
Tu ne veut pas donner de nom à ton fichier de sorti (File_O= ) ?
La variables $rep c'est le nom du dossier que l'on veut traiter, il faut le passer en paramètre :
&listDirectory("/home/truc/dossier");
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Au fait, j'utilise une fonction sans paramètre qui appelle votre fonction :

sub CONCAT_FILE()
{
sub listDirectory { }

}

...

Je viens de faire la modif , mais malheureusement ça ne marche pas :((

#CONCAT File
#------------------------------------------------------------------------------
$LIBEL="CONCAT_FILE_SWIFT";
$CONCAT_I="A_2010_*";
$CONCAT_O="A_2010_CONCAT_date()";
$CONCAT_REP="home/répertoire";
&CONCAT_FILE();
Messages postés
28
Date d'inscription
vendredi 20 juillet 2012
Statut
Membre
Dernière intervention
31 juillet 2012

Merci pour ton aide :)