Extraire des colonnes d'un fichier .txt

Fermé
sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015 - 25 mars 2015 à 09:36
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 3 avril 2015 à 17:49
Bonjour, je suis novice dans la programmation Perl mais j'ai téléchargé des tutos et cours que je bosse. En effet je suis bloqué par un programme que je dois écrire me permettant d'extraire des colonnes d'un fichier .txt et ensuite de les mettre les unes à la suite des autres dans une seule colonne.
Merci de vouloir m'accorder un bout de votre temps.
A voir également:

5 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 25/03/2015 à 10:34
Salut sekkeith,

Montre nous :

- ton jeu de données de départ
- le résultat attendu par rapport à ce jeu de données
- ce qui te pose exactement problème dans le code que tu as déjà commencé à faire

Dal
0
sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015
25 mars 2015 à 11:54
Merci d'avoir répondu.
Mon jeu de données se présente :
"\t" DL LU TW MO
Csf x1 y1 z1 t1
Ind x2 y2 z2 t2
Tran x3 y3 z3 t3
other x4 y4 z4 t4

separées par des "\t"
format de sortie
Csf DL x1
Ind DL x2
Tran DL x3
other DL x4
Csf LU y1
Ind LU y2
Tran LU y3
other LU y4
Csf TW z1
Ind TW z2
Tran TW z3
other TW z4
Csf MO t1
Ind MO t2
Tran MO t3
other MO t4

Ainsi de suite c'est un bout, il y'a plus de lignes et plus de colonnes.
Merci encore.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
25 mars 2015 à 13:29
- ce qui te pose exactement problème dans le code que tu as déjà commencé à faire

Où es ton code problématique dans ce que tu as déjà commencé à faire ?


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
25 mars 2015 à 15:11
si tu sors les lignes, cela sera plus facile, est-ce qu'une sortie comme ceci irait aussi :
Csf	DL	x1 
Csf LU y1
Csf TW z1
Csf MO t1
Ind DL x2
Ind LU y2

etc.

Dal

NB : quand tu postes, utilise les balises de code (symbole <> à droite des boutons de l'éditeur pour des données formatées, et clique sur la flèche pointant vers le bas pour un formatage de code source dans un langage donné)
0
sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015
26 mars 2015 à 18:14
Merci pour ton attention
Peux tu me faire voir le code qui donne la structure que tu me presente?
Merci!
Voici ce que j'ai tenté d'ecrire et ça ne m'a rien donné
#!/usr/bin/perl -w

use strict;
use warnings;

open(FILE, "iea_ci_1990.txt") || die "Erreur E/S : $!\n";
my @contenu = <FILE>;
close(FILE);

open(FILE, ">fichier2.txt") || die "Erreur E/S : $!\n";
foreach (@contenu) {
my @datas = split(/\t/, $_);
for (my $n=1; $n==11;$n+=1){
print FILE "$datas[0] $datas[$n]\n";
}
}
close(FILE);

                
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
26 mars 2015 à 19:14
tu n'as pas mis ton code à l'intérieur de la balise code, du coup ton code n'est pas formaté.

sinon, tu dis que tu apprends Perl par tes propres moyens et que tu fais cet exercice dans le cadre de ton apprentissage... si j'écris le code à ta place, tu ne fais pas l'exercice... veux-tu vraiment que j'écrive ce code ?

avant d'écrire quoi que ce soit, pour tes données de départ, il y a un truc bizarre sur la première ligne où tu mets "\t" ... est-ce que ces caractères sont vraiment dans ta première ligne, ou est-ce que tu veux dire que la première ligne commence par une tabulation ?

en d'autres termes, tes données de départ sont du type :

    DL  LU  TW  MO
Csf x1 y1 z1 t1
Ind x2 y2 z2 t2
Tra x3 y3 z3 t3
oth x4 y4 z4 t4

ou alors comme tu l'écrivais :

"\t" DL LU TW MO
Csf x1 y1 z1 t1
Ind x2 y2 z2 t2
Tra x3 y3 z3 t3
oth x4 y4 z4 t4

(note : il y a bien une tabulation séparant chaque colonne dans les deux cas ci-dessus)

Par ailleurs, tu n'as pas répondu à cette question sur le format de sortie : https://forums.commentcamarche.net/forum/affich-31749092-extraire-des-colonnes-d-un-fichier-txt#4

Dal
0
sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015 > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
26 mars 2015 à 19:28
Bonsoir effectivement "\t" pour dire qu'il y a un espace
Bon vraiment si j'ai le code ça me permettra d'avancer un peu.
<#!/usr/bin/perl -w
use strict;
use warnings;

open(FILE, "iea_ci_1990.txt") || die "Erreur E/S : $!\n";
my @contenu = <FILE>;
close(FILE);

open(FILE, ">fichier2.txt") || die "Erreur E/S : $!\n";
foreach (@contenu) {
my @datas = split(/\t/, $_);
for (my $n=1; $n==11;$n+=1){
print FILE "$datas[0] $datas[$n]\n";
}
}
close(FILE);

></code>
0
sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015 > sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015
26 mars 2015 à 19:29
Je ne réussis toujours pas à l'écrire comme tu le dis.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
27 mars 2015 à 10:24
salut sekkeith,

pour la 3ème fois : tu n'as pas répondu à cette question sur le format de sortie : https://forums.commentcamarche.net/forum/affich-31749092-extraire-des-colonnes-d-un-fichier-txt#4

Dal
0
sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015 > [Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024
27 mars 2015 à 12:31
Bonjour
le format que tu proposes est bon je le réarrangerai après:
Csf DL x1
Csf LU y1
Csf TW z1
Csf MO t1
Ind DL x2
Ind LU y2
merci !
0
sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015
3 avril 2015 à 15:36
OK merci pour le code il marche super bien bien.Eexcuse moi j'étais en déplacement, donc pas de connexion.
Peux tu m'expliquer un peu cette séquence:
($line =~ /([^\t]+)\t(.*)/)
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 3/04/2015 à 17:54
cette ligne signifie :

- teste le contenu de
$line
selon l'expression rationnelle qui suit
- les parenthèses opèrent une capture de ce qui matche le contenu de la parenthèse
- la première parenthèse matche, à partir du début de la ligne, un ou plusieurs caractères qui ne sont pas des tabulations :
[^\t]+
(les crochets permettent d'établir une classe de caractères, dans ce contexte le
^
est une négation, le
+
est le quantificateur "un ou plusieurs")
- puis la regexp matche une tabulation
- puis la deuxième parenthèse matche tout ce qui est à la suite sur cette ligne, quel qu'en soit le contenu :
.*
(le point signifie n'importe quel caractère et l'étoile
*
est le quantificateur "0 ou plus")

la première capture est rangée par Perl dans
$1
et la deuxième dans
$2
.

comme la regexp est évaluée dans le contexte d'un test, elle sert non seulement à capturer les données, mais aussi à vérifier que le format de cette ligne correspond au format attendu

chouette, non ?

Dal
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sekkeith Messages postés 8 Date d'inscription mercredi 25 mars 2015 Statut Membre Dernière intervention 3 avril 2015
3 avril 2015 à 15:40
Encore une fois merci pour l'aide. Aussi comment mettre un lien sur ce post du forum?
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
3 avril 2015 à 17:35
le lien vers le fil est indiqué dans le code source, le lien vers le post est : https://forums.commentcamarche.net/forum/affich-31749092-extraire-des-colonnes-d-un-fichier-txt#11
0