Kdb 将符号转换为符号列表

Kdb 将符号转换为符号列表,kdb,Kdb,我在csv文件中读取: csvFile:1!("SSS"; enlist ",") 0: hsym `$"\\\\location\\of\\csv"; 但符号列表被解读为单个符号。e、 g.在csv文件中,我有'a'b'c但是 csvFile`some_keyed_value `col1`col2!``a`b`c` 我想要的是这个——请注意,单个股票代码应该是一个空列表: `col1`col2!(`a`b`c;()) 是否有办法使此强制转换或以不同方式读取csv,或修改csv以使其正确读

我在csv文件中读取:

csvFile:1!("SSS"; enlist ",") 0: hsym `$"\\\\location\\of\\csv";
但符号列表被解读为单个符号。e、 g.在csv文件中,我有
'a'b'c
但是

csvFile`some_keyed_value
`col1`col2!``a`b`c`
我想要的是这个——请注意,单个股票代码应该是一个空列表:

`col1`col2!(`a`b`c;())
是否有办法使此强制转换或以不同方式读取csv,或修改csv以使其正确读取?我对csv所做的任何修改(例如,将
'
替换为
()
)都只是将其转换为单个符号(例如,我得到
'()

下面是csv中几行的屏幕截图


以该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"

以该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"

对于您的输入,下面的工作。您还可以使用剪切而不是vs,如前一个示例中所示

q)update `$table, `$_[1;]each vs["`";]each writeAllow, `$_[1;]each 
vs["`";]each writeLog from ("***";enlist",")0:`:tmp.csv

table       writeAllow            writeLog
------------------------------------------------------
:/loader/P1 `pg`sec-fg-id         `symbol$()
:/loader/P2 `pg`shara`mcdonald    `pg`MD`svc
:/loader/P3 `symbol$()            `pg`MD`svc

您可能应该重新考虑使用backticks存储sym数据-使用不同的分隔符来分隔子记录,并使用专门的函数来解析这些字段,这将是非常简单的。您还可以使用剪切而不是vs,如前一个示例中所示

q)update `$table, `$_[1;]each vs["`";]each writeAllow, `$_[1;]each 
vs["`";]each writeLog from ("***";enlist",")0:`:tmp.csv

table       writeAllow            writeLog
------------------------------------------------------
:/loader/P1 `pg`sec-fg-id         `symbol$()
:/loader/P2 `pg`shara`mcdonald    `pg`MD`svc
:/loader/P3 `symbol$()            `pg`MD`svc
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

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

您还可以使用函数
value
将嵌入倒勾的字符串转换为符号列表

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
// 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
,如果它也符合您的目的,即
从…

更新每个col1的值。您还可以使用函数
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
,即
更新每个列的值…

您可以添加CSV文件的示例吗?这个文件里到底是什么还不是很清楚。几行应该很好绝对,我添加了几行的截图。如果你还需要什么,请告诉我。列A是重要信息的关键。能否添加CSV文件的示例?这个文件里到底是什么还不是很清楚。几行应该很好绝对,我添加了几行的截图。如果你还需要什么,请告诉我。列A是需要知道的重要情况下的键。tab与预期的一样,但下一个更新行给出:在执行查询期间发生错误。服务器发送了响应:x是否将
x
或列名传递给lambda?啊,是的,误读了lambda。它的工作原理与user2242865的一个相同,因为user2242865的一个在注释中指出存在问题,所以切换到使用这个。许多thanx.tab与预期的一样,但是下一个更新行告诉我:在执行查询期间发生了一个错误。服务器发送了响应:x是否将
x
或列名传递给lambda?啊,是的,误读了lambda。它的工作原理与user2242865的一个相同,因为user2242865的一个在注释中指出存在问题,所以切换到使用这个。许多thanx.Perfect thanx最终之所以使用它,仅仅是因为它少了一行,但Thomas的剪切答案与您所说的完全相同。实际上,问题是:键入的值并不总是有一个前导“:”但这会在没有前导的情况下加载键控值,并添加前导:这里的问题是您试图操作kdb+具有特殊表示形式的数据结构,但kdb+不会以您尝试读取的格式保存它们。带前导“:”的字符串表示文件路径(),符号用前导“`”写入。我不建议将它们存储在csv表示中-它们只在kdb+中有意义。您也可以从上面的代码行中删除
hsym
。公平点-假设它们将用作文件路径。。。已更改。Perfect thanx最终之所以使用此选项,只是因为它少了一行,但Thomas的剪切答案的工作原理与您所说的相同。实际上,问题是:键入的值并不总是有前导“:”但这会在没有前导的情况下加载键控值,并添加前导:这里的问题是您试图操作kdb+具有特殊表示形式的数据结构,但kdb+不会以您尝试读取的格式保存它们。带前导“:”的字符串表示文件路径(),符号用前导“`”写入。我不建议将它们存储在csv表示中-它们只在kdb+中有意义。您也可以从上面的代码行中删除
hsym
。公平点-假设它们将用作文件路径。。。已更改。这不适用于带有特殊字符(如“`sec fg id”)的符号-仅在可行列上运行,如op给出的实际示例中的writeLog。我的示例数据可能太简单了。这不适用于带有特殊字符(如“`sec fg id”)的符号-仅在可行列上运行,在op给出的实际示例中使用writeLog。我的示例数据可能太简单了