【问题标题】:Is there a way to iterate through the alphabet in kdb?有没有办法遍历 kdb 中的字母表?
【发布时间】:2019-01-10 15:24:51
【问题描述】:

我正在编写一个函数来从数据库中选择所有以字母“A”开头的符号,然后是“B”,直到字母“Z”。我有一个虚拟表,其中包含 3 个字符,如下所示...

t:([]symbol:`A`App`B`Bapp`C`Capp; price:104.3 124.3 134.2 103.4 402.7 209.8; ID:1 2 3 4 5 6)

还有一个函数可以从表中选择符号看起来像 x...

fetch:{[x;y]select from x where symbol like y}

然后我为每个字母调用该函数并插入到一个新表中...

fetchedA:h (`fetch; `t; "A*")
fetchedB:h (`fetch; `t; "B*")
fetchedC:h (`fetch; `t; "C*")

新的空表以及 upsert 函数...

newNormData:([]symbol:`$(); price:`float$(); ID:`int$())
newNorm:{[x] `newNormData upsert x}

h (`newNorm; fetchedA)
h (`newNorm; fetchedB)
h (`newNorm; fetchedC)

我不想为每个服务器进行 26 次函数调用,我想进行 1 次调用来遍历字母表中的每个字符。在 kdb/q 中执行此操作的正确方法是什么?

【问题讨论】:

    标签: kdb


    【解决方案1】:

    我相信您正在寻找fetch[t] each .Q.A,'"*"。您可以通过运行

    执行此操作并更新插入新表
    h({`newNormData upsert fetch[`t] x;}';.Q.A,'"*")
    

    客户端。

    或者,如果您希望插入仅以大写字母开头并按字母顺序排列的符号,则执行起来可能更简单

    newNormData:`symbol xasc select from t where symbol like "[A-Z]*"
    

    改为。

    【讨论】:

      【解决方案2】:

      .Q.a 变量提供小字符列表,.Q.A 提供大写字符列表。您可以将它们用于迭代。有几种方法可以做到这一点:

      1. 对字符进行简单的迭代并调用每个字符。效率较低,因为这会产生许多 rpc 调用。

          q)  fetchAll: raze{h (`fetch; `t;x}) each .Q.A,'"*"
        
      2. 效率更高,因为它只进行 1 次 rpc 调用。使用“喜欢”功能在模式中进行替代选择。例如下面的命令将选择以 A 或 B 开头的符号。

        例如:从表中选择“[A|B]*”之类的符号

      以下命令将考虑所有字符。

          q)  h(`fetch; `t;"[",("|" sv enlist each .Q.A),"]*")
      

      此外,如果您的表和函数都在同一台服务器上,那么您不需要不同的 rpc 调用来先获取符号数据然后更新 newNorm 表。你可以在一个电话中做到这一点。一种方法是在服务器上定义函数并调用它。

      服务器上的功能:

        q) fetchAndUpdNorm:{[x]`newNormData upsert fetch[t] x}
      

      在客户端:

        q)  h(`fetchAndUpdNorm;"[",("|" sv enlist each .Q.A),"]*")
      

      根据 Jonathon 评论更新:

      第二个例子的替代命令:

       q)  h(`fetch; `t;"[A-Z]*")
      

      最后一种情况:

       q)  h(`fetchAndUpdNorm;"[A-Z]*")
      

      【讨论】:

      • 第二个例子,在 q 正则表达式的字符之间不需要|。您也可以使用"[A-Z]*" 更简洁地执行此操作,而不必将每个字符单独放入其中
      • 不错。我没有意识到这一点。
      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2022-07-17
      • 2022-01-13
      • 2020-11-27
      • 2021-03-09
      • 2016-01-16
      • 2016-05-03
      相关资源
      最近更新 更多