KDB: попробуйте перехватить список и вернуть список ошибок - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу запустить функцию

{`Security $ x}

над списком

order`KDB_SEC_ID

и вернуть список значений, которые не удалось.У меня есть ниже, который работает, но мне интересно, есть ли более аккуратный способ написать это без использования цикла do.

Пример кода:

idx:0; 
fails:(); 
do[count (order`KDB_SEC_ID); 
  error:@[{`Security$x};(order`KDB_SEC_ID)[idx];0Nj];
  if[error=0Nj;fails:fails,(order`KDB_SEC_ID)[idx]];
  idx:idx+1;
  ];
  missingData:select from order where KDB_SEC_ID in distinct fails;

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Я согласен, что ответ Терри - самый простой метод, но здесь есть более простой способ сделать метод, который вы пытались помочь вам увидеть, как добиться этого без использования циклов do

q)SECURITY
`AAPL`GOOG`MSFT

q)order
KDB_SEC_ID val
--------------
AAPL       1
GOOG       2
AAPL       3
MSFT       4
IBM        5

q)order where @[{`SECURITY$x;0b};;1b] each order`KDB_SEC_ID
KDB_SEC_ID val
--------------
IBM        5

Он выводит 0b если оно проходит, и 1b, если это не удается, в результате получается логический список.Использование where в логическом списке возвращает индексы, в которых встречаются 1b, которые можно использовать для индексации в order для возврата ошибочных строк.

0 голосов
/ 18 сентября 2018

Если ваш тест проверяет, какие из KDB_SEC_ID можно перечислить в списке Security, не могли бы вы сделать

q)select from order where not KDB_SEC_ID in Security

Или я что-то упустил?

Чтобы ответить на ваш вопрос в более общем случае, вы можете выполнить попытку перехвата списка, чтобы вернуть список ошибок, используя что-то вроде

q){x where @[{upper x;0b};;1b] each x}(2;`ab;"Er";1)
2 1
...