Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Langage
Langage Toutes vos questions sur les scripts Perl en général. Avant de poster, veuillez consulter les FAQs perl, les cours Perl, les critiques de livres et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 10h26   #21
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
Le bug, c'est que si on sélectionne la dernière colonne et qu'on la place avant la fin, les lignes seront coupées en deux. Et même si on la met en dernier, comme dans le fichier d'origine, on aura une ligne vide sur deux.
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 10h32   #22
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
modification effectuée dans les sources. C'est ok pour toi ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 10h34   #23
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
Oui, ça me semble parfait. Par contre, j'ai pas refait d'essai... Il aurait été intéressant dans l'article de mettre un exemple de csv
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 10h40   #24
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
Je ne suis pas contre un autre exemple de csv. Si tu en as un sous la main, met le sur ce fil et je le rajoute dans la source.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 11h22   #25
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
En fait, c'est OK, j'ai récupéré le fichier de test avec un copier/coller et je l'ai testé avec la dernière colonne en premier : tout baigne (et il y avait bien un bug).
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 11h23   #26
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
Citation:
Envoyé par Philou67430 Voir le message
En fait, c'est OK, j'ai récupéré le fichier de test avec un copier/coller et je l'ai testé avec la dernière colonne en premier : tout baigne (et il y avait bien un bug).
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h28   #27
Alek-C
Membre Expert
 
Homme Alexis
Responsable d'Exploitation
Inscription : février 2003
Messages : 924
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Responsable d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 924
Points : 1 766
Points : 1 766
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par Philou67430 Voir le message
Q/R : Comment afficher des colonnes particulières depuis un fichier de type xsv (tableau texte) ?
Chapitres : Traitement de fichiers
Testé sous : Linux, Windows

Code :
perl -ne 'print join " ", @{[ split /;/ ]}[8,0]' fichier.csv
Dans ce code, l'expression régulière du split constitue le séparateur de colonne du fichier d'entrée passé en paramètre (le retour à la ligne est considéré comme le séparateur de ligne).
Les colonnes affichées dans l'exemple sont les colonnes d'indice 8 et 0, dans cet ordre. Elles sont affichées avec le paramètre du join comme séparateur.
Hello,

Je viens de tomber sur ce sujet, et je vais peut-être dire une bêtise, mais pourquoi ne pas utiliser l'option "-a" dans ce cas ? Est-ce parce qu'elle n'est pas disponible partout ?

Avec l'exemple cité, ceci semble fonctionner (tout du moins sous Linux) :
Code :
perl -naF';' -e 'print "$F[8] $F[0]\n"' fichier.csv
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h34   #28
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
Tout bonnement parce que je ne connaissais pas ces options -a et -F

Il faut naturellement utiliser ces options qui simplifient l'uniligne d'origine :

Code :
perl -naF';' -e 'chomp;print join qq( ), @F[8,0], $/' fichier.csv
En attente d'un essai, je remet chomp qui, d'après la doc, n'est pas fait par l'option -a.
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h37   #29
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
En fait, c'est plus compliqué que cela, le chomp n'est pas fait, et l'introduire sur $_ ne fonctionne pas : il faut le faire sur $F[$#F], ce qui alourdit légèrement l'uniligne (il serait logique que -a fasse le chomp).

Code bash :
perl -naF';' -e 'chomp($F[$#F]);print join qq( ), @F[8,0], $/' fichier.csv
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h39   #30
Philou67430
Expert Confirmé
 
Inscription : avril 2009
Messages : 2 633
Détails du profil
Informations personnelles :
Âge : 47

Informations forums :
Inscription : avril 2009
Messages : 2 633
Points : 3 079
Points : 3 079
Au final, l'option -l nous sauve la vie, et fait le chomp avant que l'option -a découpe l'entrée :

Code :
perl -nlaF';' -e 'print join qq( ), @F[8,0], $/' fichier.csv
__________________
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Using strict and warnings is good for you.
Philou67430 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h39   #31
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
-l permet le traitement automatique des fins de ligne. Cette option a deux effets :

Utilisée avec -n ou -p, elle fait automatiquement un chomp au début de la boucle implicite.

Elle affecte à $\ (le séparateur d'enregistrements en sortie) le caractère dont la valeur octale a été passée. Si aucune valeur octale n'est donnée, l'option met $\ à la valeur courante de $/.

Cette affectation $\ = $/ est faite au moment où l'option est rencontrée. Le séparateur d'enregistrements en entrée peut donc être différent du séparateur en sortie si l'option -l est suivie par l'option -0.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h47   #32
Alek-C
Membre Expert
 
Homme Alexis
Responsable d'Exploitation
Inscription : février 2003
Messages : 924
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Responsable d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 924
Points : 1 766
Points : 1 766
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Effectivement, c'est dommage de devoir gérer ce chomp / saut de ligne, je n'y avais pas pensé !

Je crois aussi qu'on peut utiliser $F[-1] pour le dernier élément d'un tableau (au lieu de $F[$#F]) ce que je trouve personnellement un peu plus parlant (et surtout, on peut aussi utiliser -2 -3... ).

Mais là encore, je ne sais pas si c'est compatible partout !
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h49   #33
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
On pourrait expliquer que le code
Code :
perl -nlaF';' -e 'print join qq( ), @F[8,0], $/' fichier.csv
équivaut à
Code :
1
2
3
4
5
6
7
#!/usr/bin/perl
$\ = $/;                            # option -l
while (<>) {                        # option -n
  chomp $_;                         # options -l et -n
  @F = split /;/;                   # option -a et -F
  print join qq( ), @F[8,0], $/;    # option -e
}
Qu'en pensez-vous ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/05/2011, 11h50   #34
Alek-C
Membre Expert
 
Homme Alexis
Responsable d'Exploitation
Inscription : février 2003
Messages : 924
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Responsable d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 924
Points : 1 766
Points : 1 766
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
ça peut être une bonne chose
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 11h52   #35
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
sinon petit bug :
Code csv :
1
2
col0;col1;col2;col3;col4;col5;col6;col7;col8;col9;col10
test1;test2;test3;test4;test5;test6;test7;test8;test9;test10;test11

Sous Windows
Code :
perl -nlaF';' -e "print join q(-), @F[8,0], $/" test.csv
Résultat :
Citation:
col8-col0-

test9-test1-
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 12h04   #36
Alek-C
Membre Expert
 
Homme Alexis
Responsable d'Exploitation
Inscription : février 2003
Messages : 924
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Responsable d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 924
Points : 1 766
Points : 1 766
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
J'ai l'impression qu'avec l'option -l, il ne faut pas afficher le saut de lignes :

Code :
perl -nlaF';' -e 'print join qq( ), @F[8,0]' fichier.csv
peut-être que perl ajoute automatiquement le print qui va bien à chaque itération ?

(ton code donnait la même chose sous Linux djibril)

Edit, bon, en fait, c'est exactement ce que fait $/ (que je ne connaissais pas )
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/05/2011, 12h05   #37
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
Citation:
Envoyé par Alek-C Voir le message
J'ai l'impression qu'avec l'option -l, il ne faut pas afficher le saut de lignes :

Code :
perl -nlaF';' -e 'print join qq( ), @F[8,0]' fichier.csv


Je modifierais qq{ } en q{ }. Il n'y a pas d'interpolation, donc qq est inutile.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 12h08   #38
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
Alek-C, je t'ajoute dans les auteurs des sources . Tes futurs propositions sont les bienvenues.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 12h14   #39
Alek-C
Membre Expert
 
Homme Alexis
Responsable d'Exploitation
Inscription : février 2003
Messages : 924
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 33
Localisation : France

Informations professionnelles :
Activité : Responsable d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 924
Points : 1 766
Points : 1 766
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Citation:
Envoyé par djibril Voir le message
Alek-C, je t'ajoute dans les auteurs des sources . Tes futurs propositions sont les bienvenues.
Oula, faut pas s'emballer, j'ai carrément pas le niveau en perl ! Je suis tombé sur ce sujet par hasard, et par hasard aussi, j'ai découvert le -a (je cherchais le moyen de faire un traitement à la fin d'un perl -ne... pour vider un buffer ) :p

Plus sérieusement, c'est avec plaisir que je penserais à ce topic, j'utilise souvent des petits scripts perl pour éviter de jongler entre les différentes versions de sed/awk/grep qu'on trouve selon les OS, et si certains me semblent utiles, je viendrais les soumettre ici sans problème ! Par contre, il y aura sans doute des retouches à faire
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 12h15   #40
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 489
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 489
Points : 31 590
Points : 31 590
Voilà : Comment afficher des colonnes particulières depuis un fichier de type csv (tableau texte) ?
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h22.


 
 
 
 
Partenaires

Hébergement Web