2017-10-04 4 views
1

Comment puis-je ajouter une colonne contenant une sous-chaîne d'une autre colonne contenant des symboles. Donc, aller deKDB get substring

t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1) 

date sym pos 
d1 aaaA1 1 
d1 bbA1  2 
d1 aaaA2 3 
d2 aaaA3 1 

à

t:flip `date`sym`pos`ext!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1;`aaa`bbb`aaa`aaa) 

date sym pos ext 
d1  aaaA1 1 aaa 
d1  bbA1 2 bb 
d1  aaaA2 3 aaa 
d2  aaaA3 1 aaa 

EDIT. La sous-chaîne doit toujours contenir le premier len (symbole) -2 caractères, donc dans mon exemple ci-dessus, aaa pour aaaAx et bb pour bbAx

Répondre

1

Si la sous-chaîne que vous souhaitez extraire est une longueur constante, vous pouvez faire quelque chose comme ça suivant:

q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1) 
q)update ext:`$3#'string sym from t 
date sym pos ext 
------------------ 
d1 aaaA1 1 aaa 
d1 bbbA1 2 bbb 
d1 aaaA2 3 aaa 
d2 aaaA3 1 aaa 

Si ce n'est pas le cas, s'il vous plaît fournir un peu plus de détails en ce qui concerne la façon dont la sous-chaîne à extraire peuvent être identifiés

Hope this helps

Jonathon

+0

Merci pour la réponse. J'ai fourni plus de détails sur la sous-chaîne dans l'édition – chrise

+1

Dans ce cas, vous pouvez utiliser 'mise à jour ext: \' $ -2_'string sym de t' –

1

Il peut y avoir une manière intelligente d'appliquer ceci ci-dessous, mais c'est ce que j'ai d'abord trouvé.

t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1) 
t: update ctr: {-2 + count string x} each sym from t; 
t:{[x] :update ext:x[`ctr]#string(x[`sym]) from x} each t; 

2ème ligne est l'application de votre logique: len (symbole) - 2 3ème ligne prend le numéro « ctr » des caractères des personnages de symboles originaux.

+0

ah, doux ... Je suis arrivé à la deuxième ligne basée sur Jonathon répondre, mais je ne pouvais pas le faire fonctionner dans la mise à jour. Je ne savais pas '{} chaque t'. Merci – chrise

+0

si vous exécutez ceci à un ensemble de données vraiment grand (~ centaines de millions de lignes), la performance peut être un problème parce que le code ci-dessus passe chaque ligne à la fonction. dans ce cas, vous voudrez peut-être optimiser le code. Dans les autres cas, je pense que ça devrait aller. – jeonw

0

En utilisant drop:

q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbA1`aaaA2`aaaA3;1 2 3 1) 
q)update ext:`$-2_'string sym from t 
date sym pos ext 
------------------ 
d1 aaaA1 1 aaa 
d1 bbA1 2 bb 
d1 aaaA2 3 aaa 
d2 aaaA3 1 aaa 
0

Vous ne le dit pas, mais cela est KDB +, donc supposons:

  • votre table est longue
  • votre colonne sym a des doublons

Vous n'avez pas besoin de convertir tous les symboles en chaînes et retour: seulement les distincts. (Dans cet exemple, j'ai changé l'un des symboles pour créer un doublon.)

q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA1;1 2 3 1) 
q)update ext:{nub:distinct x;(`$-2 _'string nub)nub?x}sym from t 
date sym pos ext 
------------------ 
d1 aaaA1 1 aaa 
d1 bbbA1 2 bbb 
d1 aaaA2 3 aaa 
d2 aaaA1 1 aaa 

Le utility .Q.fu applique une fonction aux éléments distincts.

q)update ext:.Q.fu[{`$-2 _'string x};sym] from t 
date sym pos ext 
------------------ 
d1 aaaA1 1 aaa 
d1 bbbA1 2 bbb 
d1 aaaA2 3 aaa 
d2 aaaA1 1 aaa 

Cette opération serait plus rapide si la colonne sym étaient déjà stockées en tant enumeration, parce que les valeurs distinctes seraient alors disponibles sans calcul.