Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Dernière révision Les deux révisions suivantes | ||
collate_sqlite3 [2010/12/03 09:56] tyrtamos |
collate_sqlite3 [2015/03/03 17:53] tyrtamos |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Comment faire un tri français avec collate ====== | ====== Comment faire un tri français avec collate ====== | ||
+ | [Refonte de la page le 3/3/2015. Passage à Python 3] | ||
===== Problématique ===== | ===== Problématique ===== | ||
Ligne 6: | Ligne 7: | ||
Quand on veut extraire d'une base SQL des informations texte triées en utilisant 'ORDER BY', on se heurte au problème habituel: l' | Quand on veut extraire d'une base SQL des informations texte triées en utilisant 'ORDER BY', on se heurte au problème habituel: l' | ||
- | * ' | + | * ' |
- | * ' | + | * ' |
===== Solution ===== | ===== Solution ===== | ||
Pour trier selon l' | Pour trier selon l' | ||
- | |||
* un entier <0 si v1<v2 | * un entier <0 si v1<v2 | ||
- | |||
* 0 si v1==v2 | * 0 si v1==v2 | ||
- | |||
* un entier >0 si v1>v2 | * un entier >0 si v1>v2 | ||
- | Ceci, comme on peut le faire avec la méthode sort() du Python | + | Ceci, comme on peut le faire avec la méthode sort() du Python. |
- | Prenons la fonction de comparaison qu'on a déjà sur une autre page de ce site ([[http:// | + | Voilà le code proposé |
- | <code python> | + | <code python>import locale |
- | def compalpha(v1, | + | |
- | """ | + | |
- | | + | |
- | v1, v2 doivent être en utf-8 | + | |
- | """ | + | |
- | alpha = ur""" | + | |
- | ur""" | + | |
- | ur""" | + | |
- | ur""" | + | |
- | alpha = alpha.encode(' | + | |
- | lgalpha = len(alpha) | + | |
- | lg1 = len(v1) | + | |
- | lg2 = len(v2) | + | |
- | lg = min([lg1, | + | |
- | for i in range(0, | + | |
- | i1 = alpha.find(v1[i]) | + | |
- | if i1<0: | + | |
- | i1 = lgalpha + ord(v1[i]) | + | |
- | i2 = alpha.find(v2[i]) | + | |
- | if i2<0: | + | |
- | i2 = lgalpha + ord(v2[i]) | + | |
- | if i1<i2: | + | |
- | return -1 | + | |
- | if i1>i2: | + | |
- | return 1 | + | |
- | # ici, les lg premiers caractères sont identiques: le mot le plus court est avant l' | + | |
- | return lg1-lg2 | + | |
- | </ | + | |
- | Le principe est simple: c'est vous qui donnez l' | + | ############################################################################# |
+ | class Compdicofr(object): | ||
+ | """ | ||
+ | def __init__(self): | ||
+ | self.loc = locale.getlocale() | ||
+ | self.espinsec = ' | ||
+ | |||
+ | def __call__(self, | ||
+ | |||
+ | # on retire les tirets et les blancs insécables | ||
+ | v1 = v1.replace(' | ||
+ | v1 = v1.replace(self.espinsec, | ||
+ | v2 = v2.replace(' | ||
+ | v2 = v2.replace(self.espinsec, | ||
+ | |||
+ | # on fait la comparaison selon la locale | ||
+ | locale.setlocale(locale.LC_ALL, | ||
+ | comp = locale.strcoll(v1, | ||
+ | |||
+ | # retour à la locale initiale | ||
+ | locale.setlocale(locale.LC_ALL, | ||
+ | |||
+ | # on retourne le résultat de la comparaison | ||
+ | return comp | ||
+ | |||
+ | compdicofr = Compdicofr() | ||
+ | </ | ||
\\ | \\ | ||
- | Prenons maintenant un exemple: on crée une base sqlite3 contenant une table " | + | Prenons maintenant un exemple: on crée une base sqlite3 contenant une table " |
< | < | ||
Ligne 66: | Ligne 62: | ||
Xabcù | Xabcù | ||
Abcè | Abcè | ||
+ | êqsdf | ||
</ | </ | ||
Ligne 71: | Ligne 68: | ||
<code python> | <code python> | ||
- | cur.execute(" | + | cur.execute(" |
+ | | ||
+ | | ||
+ | | ||
+ | "" | ||
datas = cur.fetchall() | datas = cur.fetchall() | ||
Ligne 85: | Ligne 86: | ||
abcé | abcé | ||
xabc | xabc | ||
+ | êqsdf | ||
</ | </ | ||
- | Vous constatez que ce n'est pas terrible: le ' | + | Vous constatez que ce n'est pas terrible: le ' |
\\ | \\ | ||
Ligne 93: | Ligne 95: | ||
<code python> | <code python> | ||
- | cnx.create_collation(" | + | cnx.create_collation(" |
- | cur.execute(" | + | cur.execute(" |
+ | | ||
+ | | ||
+ | | ||
+ | "" | ||
datas = cur.fetchall() | datas = cur.fetchall() | ||
Ligne 108: | Ligne 114: | ||
abcé | abcé | ||
Abcè | Abcè | ||
+ | êqsdf | ||
xabc | xabc | ||
Xabcù | Xabcù |