Collection count

Bonjour

j’ai un tableau contenant plusieurs milliers de lignes et je souhaite
obtenir celles qui contiennent une chaine de caractère particulière,
disons :
$chaine:="@"+$chaine+"@"

Donc, je peux faire :
$n:=count in array(MonTableau;$chaine)

Comme collections & ORDA sont plus rapide que le langage 4D si j’ai
bien écouté au dernier Summit, je me dit que faire :
$n:=$coll.countValues($chaine)
serait plus rapide. Et bien non parce que cela n’est pas possible car
la doc dit: >"Pour qu’un élément soit comptabilisé, le type de valeur doit être

égal à celui de l’élément ; la méthode utilise l’opérateur d’égalité"

Donc, comment faire avec les collections ?

: Patrick EMANUEL

Comme collections & ORDA sont plus rapide que le langage 4D si j’ai
bien écouté au dernier Summit
Je ne suis pas sûr d’avoir entendu ça, du moins c’était plus nuancé. Pfff, va encore falloir fabriquer des tests :wink:

Le https://forums.4d.com/Post/FR/28656363/1/28657192#28657192coup du filtre> que t’a proposé Roland dernièrement, ça le fait pas ?

Si si je t’assure je ne l’ai pas révé !

Le coup du filtre ne m’aide pas car cela permet de réduire une collection, enfin une “shadow copy” de la collection. Par contre, ce que je veux faire, là c’est compter quelque chose qui est inclus dans un texte.

Du coup, pour le moment, je suis parti sur un Regex pour le faire car c’est un peu plus compliqué que ce que j’ai expliqué :wink:

Patrick

: Patrick EMANUEL

Si si je t’assure je ne l’ai pas révé !
Bin voilà un cas archi défavorable :
<code 4D>
C_COLLECTION($PK_c)
$PK_c:=Créer collection
SÉLECTION VERS TABLEAU([GROSSE_TABLE]PK;$PK_al) //3 millions d’enregistrements
TABLEAU VERS COLLECTION($PK_c;$PK_al) //la vache c’est long ce truc
$find_l:=3258311 //une des toutes dernières valeurs

$fin_l:=Nombre de ticks+120
$i_l:=0
Repeter
$i_l:=$i_l+1
$pos_l:=Chercher dans tableau($PK_al;$find_l)
Jusque (Nombre de ticks>$fin_l)
$fin_l:=Nombre de ticks+120

TRIER TABLEAU($PK_al;>)
$fin_l:=Nombre de ticks+120
$i_l:=0
Repeter
$i_l:=$i_l+1
$_b:=Chercher dans tableau trié($PK_al;$find_l;>)
Jusque (Nombre de ticks>$fin_l)

$fin_l:=Nombre de ticks+120
$i_l:=0
Repeter
$i_l:=$i_l+1
$found_l:=$PK_c.indexOf($find_l)
Jusque (Nombre de ticks>$fin_l)

</code 4D>
$i_l vaut respectivement 507, 248 862, 27. Bon, peut être que indexOf n’est pas la bonne member function, aussi, je ne suis pas vraiment en terrain connu, là…

: Patrick EMANUEL

ce que je veux faire, là c’est compter quelque chose qui est inclus
dans un texte.
Je vois qu’il y a :
collection.find ( {startFrom ;} nomMéthode;…).
Ça semble pas mal, pour faire matcher un texte avec une regex, non ?

oui effectivement car, il est aussi écrit dans la doc de ‘collection.find(xxxx)’

La méthode collection.find( ) retourne la première valeur dans la collection pour laquelle nomMéthode retourne Vrai.

je vais me pencher sur ce cas, effectivement

Merci Arnaud