【问题标题】:kdb/q: How to concatenate adjacent elements in a list of strings with a space in between?kdb/q:如何连接字符串列表中的相邻元素,其间有空格?
【发布时间】:2020-12-22 23:05:05
【问题描述】:

提前感谢您的帮助! (我来自 C++ 和 Python 背景,在 kdb 中不使用 while 循环对我来说很难)

在 kdb/q 中,我有一个字符串列表,我们称之为“test”,它看起来像这样。此列表中有 7 个条目,每个条目都是一个字符串。索引 2 和 4 处的条目(字符串)为空。

test
"col_1:abc col_2:xyz"
"col_3:ijk"
""
"col_1:efg col_2:lmn"
""
"col_1:bah"
"col_3:muy"

我想将相邻的条目连接在一起,如下所示。相邻的条目用空格连接在一起,空的条目消失了

"col_1:abc col_2:xyz col_3:ijk"
"col_1:efg col_2:lmn"
"col_1:bah col_3:muy"

这是我迄今为止最好的尝试。我确信我过于复杂了,一定有更好的方法。

show {$[x~"";"|";x]}each test
"col_1:abc col_2:xyz"
"col_3:ijk"
"|"
"col_1:efg col_2:lmn"
"|"
"col_1:bah"
"col_3:muy"

show raze {$[x~"";"|";x]}each test
"col_1:abc col_2:xyzcol_3:ijk|col_1:efg col_2:lmn|col_1:bahcol_3:muy"

show "|" vs raze {$[x~"";"|";x]} each test
"col_1:abc col_2:xyzcol_3:ijk"
"col_1:efg col_2:lmn"
"col_1:bahcol_3:muy"

我很接近,但我没有在新列表的索引 0 处将“col_2:xyz”与“col_3:ijk”分隔开的所需空格,并且我没有分隔“col_1:bah”的空格来自新列表索引 2 处的“col_3:muy”。如何克服这个问题?非常感谢您的指点/提示,谢谢

【问题讨论】:

    标签: string list concatenation kdb


    【解决方案1】:

    上述没有连续空字符串的情况的快速解决方案

    q)"  "vs" "sv test
    "col_1:abc col_2:xyz col_3:ijk"
    "col_1:efg col_2:lmn"
    "col_1:bah col_3:muy"
    

    【讨论】:

    • 哦,哇,感谢您提供快速而优雅的解决方案!我从你身上学到了很多东西!
    【解决方案2】:

    如果从文件中读取字符串列表,另一种选择是使用read1 将文件读取为字节,而不是使用read0 读取为字符串。例如

    q)"  " vs {@[x;where x=0x0a;:;0x20]} read1`:test.txt
    "col_1:abc col_2:xyz col_3:ijk"
    "col_1:efg col_2:lmn"
    "col_1:bah col_3:muy "
    

    在这里,我们将换行符 (0x0a) 替换为空格 (0x20),然后在任何双空格上进行拆分(即是否有空行)。

    需要注意的是,如果文件以新行结尾,则最后一个字符串有一个尾随空格(取决于您如何使用新的字符串列表,这可能无关紧要,但如果确实如此,可能会删除最后一个字符,或使用trim 删除等)

    【讨论】:

      【解决方案3】:

      你自己的方法会这样工作:

      q)trim"|"vs" "sv{$[x~"";1#"|";x]}each test
      "col_1:abc col_2:xyz col_3:ijk"
      "col_1:efg col_2:lmn"
      "col_1:bah col_3:muy"
      

      这是一个使用cut的替代方法

      q){ltrim" "sv'cut[0,where""~/:x;x]}[test]
      "col_1:abc col_2:xyz col_3:ijk"
      "col_1:efg col_2:lmn"
      "col_1:bah col_3:muy"
      

      【讨论】:

      • 感谢您的帮助。我通过自己运行代码理解了第一个示例。但是,我无法弄清楚您在第二个解决方案中使用“cut”做什么。我知道: where ""~/: x 本质上是一个循环,它查找 "test" 中的哪些条目有一个空字符 "" 并返回索引 2 和 4。但是 cut 中的 0 是什么意思?我能找到的唯一参考是:code.kx.com/q/ref/cut,它不使用 cut[0,arg1, arg2] 格式
      • 不用担心。首先,如果x 不是整数原子,则关键字cut 的行为与_(剪切)相同,如该页底部所述。其次,我需要从头开始剪切,所以我附加到零以包含零索引。看看2 4 cut til 7和0 2 4 cut til 7的区别。
      • 哦,知道了。您只是将 0 添加到列表的开头,因此您使用索引 0 2 4 而不是索引 2 4 进行剪切。非常感谢。
      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多