IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Chiffres romains et tri


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut Chiffres romains et tri
    Bonjour,

    les nombres écrits en chiffres romains posent un problème dés lors qu'on souhaite les trier puisque ceux-ci utilisent des lettres mais ne suivent pas l'ordre alphabétique.

    Pour parer à ce problème, j'ai donc eu l'idée d'utiliser non pas des "I", des "V" et des "X" de la plage ASCII, mais les points de code de U+2160 à U+2169 (ROMAN NUMERAL x) de manière à avoir un unique point de code pour figurer un nombre (je n'ai pas besoin de grands nombres).

    J'ai ensuite procédé à quelques tests en créant des fichiers nommés (en UTF-8) avec ces fameux points de code.

    Test 1:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env bash
     
    mkdir 'Livre Lambda'
    cd 'Livre Lambda'
     
    touch 'Tome Ⅰ'
    touch 'Tome Ⅱ'
    touch 'Tome Ⅲ'
    touch 'Tome Ⅳ'
    touch 'Tome Ⅴ'
    touch 'Tome Ⅵ'
    touch 'Tome Ⅶ'

    Si je fais: find . -type f -printf "%f\n" | LC_COLLATE=C sort, j'obtiens bien l'ordre attendu:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Tome Ⅰ
    Tome Ⅱ
    Tome Ⅲ
    Tome Ⅳ
    Tome Ⅴ
    Tome Ⅵ
    Tome Ⅶ
    Ce qui n'est pas étonnant vu que dans ce cas les noms de fichiers sont comparés "bêtement" octet par octet.
    J'obtiens le même résultat avec LC_COLLATE=fr_FR.UTF-8. Donc jusque là, pas de problème.

    Test 2:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/usr/bin/env bash
     
    mkdir 'À la recherche du temps perdu'
    cd 'À la recherche du temps perdu'
     
    touch 'Tome Ⅰ : Du côté de chez Swann'
    touch 'Tome Ⅱ : À l’ombre des jeunes filles en fleurs'
    touch 'Tome Ⅲ : Le Côté de Guermantes'
    touch 'Tome Ⅳ : Sodome et Gomorrhe Ⅰ et Ⅱ'
    touch 'Tome Ⅴ : La Prisonnière'
    touch 'Tome Ⅵ : Albertine disparue'
    touch 'Tome Ⅶ : Le Temps retrouvé'

    Si je fais: find . -type f -printf "%f\n" | LC_COLLATE=C sort, j'obtiens toujours l'ordre attendu.
    Par contre si je change la collation en LC_COLLATE=fr_FR.UTF-8 alors là rien ne va plus car le Tome Ⅴ est propulsé en fin de liste:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Tome Ⅰ : Du côté de chez Swann
    Tome Ⅱ : À l’ombre des jeunes filles en fleurs
    Tome Ⅲ : Le Côté de Guermantes
    Tome Ⅳ : Sodome et Gomorrhe Ⅰ et Ⅱ
    Tome Ⅵ : Albertine disparue
    Tome Ⅶ : Le Temps retrouvé
    Tome Ⅴ : La Prisonnière

    Pour quelle raison?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Même avec de simples lettres accentuées (NFC), l'ordre n'est pas respecté:
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ echo -e "côté\ncoté\ncote\ncôte" | LC_COLLATE=fr_FR.UTF-8 sort
    cote
    coté
    côte
    côté
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Question intéressante.

    Un simple copier-coller dans vim montre qu'il y a un problème. Tous les chiffres romains sont affichés correctement sauf Ⅴ. (qui s'affiche bien dans le navigateur, vous notez).

    Pourtant, od -c donne un code normal pour le Ⅴ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    0000000   T   o   m   e     342 205 240       :       D   u       c 303                                                
    0000020 264   t 303 251       d   e       c   h   e   z       S   w   a                                                
    0000040   n   n  \n   T   o   m   e     342 205 241       :     303 200                                                
    0000060       l 342 200 231   o   m   b   r   e       d   e   s       j                                                
    0000100   e   u   n   e   s       f   i   l   l   e   s       e   n                                                    
    0000120   f   l   e   u   r   s  \n   T   o   m   e     342 205 242                                                    
    0000140   :       L   e       C 303 264   t 303 251       d   e       G                                                
    0000160   u   e   r   m   a   n   t   e   s  \n   T   o   m   e     342                                                
    0000200 205 243       :       S   o   d   o   m   e       e   t       G                                                
    0000220   o   m   o   r   r   h   e     342 205 240       e   t     342                                                
    0000240 205 241  \n   T   o   m   e     342 205 245       :       A   l                                                
    0000260   b   e   r   t   i   n   e       d   i   s   p   a   r   u   e                                                
    0000300  \n   T   o   m   e     342 205 246       :       L   e       T                                                
    0000320   e   m   p   s       r   e   t   r   o   u   v 303 251  \n   T                                                
    0000340   o   m   e     342 205 244       :       L   a       P   r   i                                                
    0000360   s   o   n   n   i 303 250   r   e  \n                                                                        
    0000372
    Dans la console, si je tape "Ⅳ Ⅴ Ⅵ" (bien affiché dans le navigateur), j'ai un trou entre Ⅳ et Ⅵ. Mais le copier-coller dans le navigateur est correct. Et le copier-coller dans xterm est correct aussi. Ma console par défaut est xfce4-terminal.

    Ce caractère Ⅴ est chatouilleux. Je ne sais pas pourquoi.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 662
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ echo 'IV
    V
    VI
    II
    I
    X
    IX
    III' | LC_COLLATE=C sort
    I
    II
    III
    IV
    IX
    V
    VI
    X

    j'ai raté un truc, ou ça trie mes genoux ?

    EDIT: d'accord. je suis passé à travers ça :
    Citation Envoyé par CosmoKnacki
    j'ai donc eu l'idée d'utiliser [...] les points de code de U+2160 à U+2169 (ROMAN NUMERAL x)
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    j'ai raté un truc, ou ça trie mes genoux ?
    Oui, tu as raté que en fr_FR.UTF-8, un caractère sort du rang pour avoir son comportement propre. CosmoKnacki a déjà dit ce que tu dis.

    [edit] Ah mais non. Tu ne prends pas les caractères unicode des chiffres romains. Trouves-tu normal d'avoir le 9 entre 2 chiffres inférieur ?[/edit]
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    @N_BaH et oui, il faut prendre les bons codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo -e "\u2160\n\u2161\n\u2162\n\u2163\n\u2164\n\u2165\n\u2166\n\u2167\n\u2168\n" | LC_COLLATE=C sort
    echo -e "\u2160\n\u2161\n\u2162\n\u2163\n\u2164\n\u2165\n\u2166\n\u2167\n\u2168\n" | LC_COLLATE=fr_FR.UTF-8 sort
    Mais le copier-coller .... Et le copier-coller ...
    Je n'ai pas utilé et cela ne change rien, pas lui le coupable (comme le disait od -c)

    Et donc dans le premier message la commande touch était ? (en bash) pas évident sur ce forum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    touch "chapitre "$'\u2167'
    ls ou sort, même punition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ls --sort=name
    'chapitre Ⅰ'  'chapitre Ⅱ'  'chapitre Ⅲ'  'chapitre Ⅳ'  'chapitre Ⅸ'  'chapitre Ⅴ'  'chapitre Ⅵ'  'chapitre Ⅶ'  'chapitre Ⅷ'
    LC_COLLATE=C ls --sort=name
    'chapitre Ⅰ'  'chapitre Ⅱ'  'chapitre Ⅲ'  'chapitre Ⅳ'  'chapitre Ⅴ'  'chapitre Ⅵ'  'chapitre Ⅶ'  'chapitre Ⅷ'  'chapitre Ⅸ'
    Pas surprenant, même problème de tri en gui dans mon Dolphin
    $moi= (:nono: !== :oops:) ? :king: : :triste: ;

Discussions similaires

  1. [Dvp.NET|Intégré] [VB.Net/C#] Convertir un chiffre arabe en chiffre romain
    Par Philippe Vialatte dans le forum Contribuez
    Réponses: 10
    Dernier message: 10/11/2008, 23h51
  2. Chiffre romains dans grande table des matieres
    Par jeremysme dans le forum Mise en forme
    Réponses: 2
    Dernier message: 09/09/2008, 11h21
  3. [Lex/Yacc] Convertir de chiffres romains en arabes
    Par Richard_Rahl dans le forum Générateurs de compilateur
    Réponses: 0
    Dernier message: 27/11/2007, 15h41
  4. formulaire chiffre romain
    Par jarod71 dans le forum Langage
    Réponses: 1
    Dernier message: 10/03/2007, 22h48
  5. [Débutant] Ecrire un nombre en chiffres romains !
    Par kriskikout dans le forum Ada
    Réponses: 2
    Dernier message: 05/12/2006, 12h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo