【问题标题】:kdb/q: How to apply a string manipulation function to a vector of strings to output a vector of strings?kdb/q:如何将字符串操作函数应用于字符串向量以输出字符串向量?
【发布时间】:2020-12-24 16:53:09
【问题描述】:

提前感谢您的帮助。我是 kdb/q 的新手,来自 Python 和 C++ 背景。 只是一个简单的语法问题:我有一个包含字段及其对应值的字符串

pp_str: "field_1:abc field_2:xyz field_3:kdb"

我编写了一个原子(标量)函数来提取给定字段的值。

get_field_value: {[field; pp_str] pp_fields: " " vs pp_str; pid_field:  pp_fields[where like[pp_fields; field,":*"]]; start_i: (pid_field[0] ss ":")[0] + 1; end_i: count pid_field[0]; indices: start_i + til (end_i - start_i); pid_field[0][indices]}

show get_field_value["field_1"; pp_str]
"abc"

show get_field_value["field_3"; pp_str]
"kdb"

现在我该如何概括这一点,以便如果我输入一个字段向量,我会得到一个值向量?我想输入(“field_1”;“field_2”;“field_3”)并输出(“abc”;“xyz”;“kdb”)。我尝试了多种方法(如下),但我只是不太了解 kdb/q 的语法,无法对我的函数进行矢量化:

/ Attempt 1 - Fail
get_field_value[enlist ("field_1"; "field_2"); pp_str]

/ Attempt 2 - Fail
get_field_value[; pp_str] /. enlist ("field_1"; "field_3")

/ Attempt 3 - Fail
fields: ("field_1"; "field_2")
get_field_value[fields; pp_str]

【问题讨论】:

    标签: string function vectorization kdb


    【解决方案1】:

    要为每个函数运行您的函数,您可以投影 pp_str 变量并将each 用于其他变量

    q)get_field_value[;pp_str]each("field_1";"field_3")
    "abc"
    "kdb"
    

    Kdb 实际上具有处理此问题的内置功能:https://code.kx.com/q/ref/file-text/#key-value-pairs

    q){@[;x](!/)"S: "0:y}[`field_1;pp_str]
    "abc"
    q)
    q){@[;x](!/)"S: "0:y}[`field_1`field_3;pp_str]
    "abc"
    "kdb"
    

    【讨论】:

    • 后续问题:但是现在我如何为我的文本文件中的每一行(“q4”中的 3 个字符串中的每一个)执行此操作?在 Python 或 C++ 逻辑中,基本上我想做一个嵌套的 for 循环,外部循环遍历每个字符串,然后在其中,对于每个字符串,内部循环获取每个键的值(字段): / 尝试 1 - 失败 get_field_value[每个字段;每个 q4] / 尝试 2 - 失败 each[get_field_value[;每个 q4]] 字段/尝试 3 - 失败 get_field_value[;每个 q4] 每个字段 我该怎么做?谢谢!
    • 一般的方法是将pp_str 设为变量,例如x,然后将其包装在一个lambda 中并应用于每个字符串。像{{@[;x](!/)"S: "0:y}[`field_1`field_3;x]}each q4 这样的东西。这是假设您要为每个字符串提取相同的字段
    【解决方案2】:

    我认为这可能是您正在寻找的语法。

    q)get_field_value[; pp_str]each("field_1";"field_2")
    "abc"
    "xyz"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2021-12-10
      • 2012-09-05
      • 2021-03-23
      • 2020-03-31
      相关资源
      最近更新 更多