Kdb 将符号转换为符号列表
我在csv文件中读取: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以使其正确读
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。我的示例数据可能太简单了