将符号转换为符号列表
Convert symbol to a list of symbols
我读入了一个 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 中几行的屏幕截图
以这个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 {`_'where["`"=x]cut x}'[x] from tab
x y
-------------------
`aa`bb ""
`cc`dd "`ee`ff"
`symbol$() "`gg`hh"
根据您的意见,以下工作。您也可以使用 cut 而不是 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
您可能应该重新考虑使用反引号存储 sym 数据 - 使用不同的定界符来分隔子记录并使用专门的函数来解析这些字段会很简单。
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:(`_"`" 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
您还可以利用函数 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 ...
我读入了一个 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 中几行的屏幕截图
以这个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 {`_'where["`"=x]cut x}'[x] from tab
x y
-------------------
`aa`bb ""
`cc`dd "`ee`ff"
`symbol$() "`gg`hh"
根据您的意见,以下工作。您也可以使用 cut 而不是 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
您可能应该重新考虑使用反引号存储 sym 数据 - 使用不同的定界符来分隔子记录并使用专门的函数来解析这些字段会很简单。
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:(`_"`" 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
您还可以利用函数 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 ...