将符号转换为符号列表

时间:2018-04-25 17:28:48

标签: kdb

我在csv文件中读到了:

csvFile:1!("SSS"; enlist ",") 0: hsym `$"\\\\location\\of\\csv";

但是符号列表被读作单个符号。例如在csv文件中我有'a'b'c

csvFile`some_keyed_value
`col1`col2!``a`b`c`

我想要的是这个 - 并注意一个单一的自动收报机应该是一个空列表:

`col1`col2!(`a`b`c;())

有没有办法以不同的方式在csv中进行此转换或读取或修改csv以使其正确读入?我对csv所做的任何修改(例如,将'替换为())只会将其转换为单个符号(例如,我得到'())。

以下是csv

中几行的屏幕截图

enter image description here

4 个答案:

答案 0 :(得分:5)

对于您的输入,以下工作。您也可以使用cut而不是vs,如前例所示。

ORDER BY

您应该重新考虑使用反引号存储sym数据 - 使用不同的分隔符存储以分隔子记录并使用专用函数来解析这些字段将非常简单。

答案 1 :(得分:3)

以此csv为例:

cat ex.csv
x,y
`aa`bb,
`cc`dd,`ee`ff
,`gg`hh

您需要首先以字符串形式加载这些嵌套的符号列:

q)show tab:("**";enlist",")0:`:ex.csv
x        y
-----------------
"`aa`bb" ""
"`cc`dd" "`ee`ff"
""       "`gg`hh"

然后,您需要删除反引号并将字符串转换为符号。一种可行的方法是:

q)update {`$1_'where["`"=x]cut x}'[x] from tab
x          y
-------------------
`aa`bb     ""
`cc`dd     "`ee`ff"
`symbol$() "`gg`hh"

答案 2 :(得分:3)

您还可以使用函数value将带有嵌入式反引号的字符串转换为符号列表。

// read in as strings as others have said
q)("**";1#",")0:`:test.csv
x      y
-------------
"`a`b" "`c`d"
"`e`f" "`g`f"
// value each string to convert to symbol lists
q)value@''("**";1#",")0:`:test.csv
x   y
-------
a b c d
e f g f
// check its now nested symbol type
q)meta value@''("**";1#",")0:`:test.csv
c| t f a
-| -----
x| S
y| S

如果符合您的目的,您当然可以在特定列上使用value,即update value each col1 from ...

答案 3 :(得分:2)

q)t
table      writeAllow               writeLog
----------------------------------------------------------
:loader/p1 "`pg`sec-fg-id"       ""
:loader/p2 "`pg`shara`cmacdonald" "`pg`MD`svc"
:loader/p3 ""                       "`pg`MD`svc"    

q)foo:(`$1_"`" vs) each
q)update foo[writeAllow], foo[writeLog] from t
table      writeAllow             writeLog
------------------------------------------------------
:loader/p1 `pg`sec-fg-id       `symbol$()
:loader/p2 `pg`shara`mcdonald `pg`MD`svc
:loader/p3 `symbol$()             `pg`MD`svc