我正在尝试替换表中列中的两个值。但是有些记录没有这两个值。整个列类型是字符串。
这是我的代码,列如下:
a:([]extraData:("xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie";"xxx=xxxx;bbbb=bbbb;Account=oooo;ffaijo=efaie";"xxx=xxxx;bbbb=bbbb;client=xxxx;ffaijo=efaie";"xxx=xxxx;bbbb=bbbb;ffaijo=efaie"))
update {";"sv @[s;where (s:";"vs x) like "client=*";:;enlist""]}each extraData from (update {";"sv @[s;where (s:";"vs x) like "Account=*";:;enlist""]}each extraData from a)
a是表。有些记录没有客户端或帐户,代码中断。我正在尝试使用像
这样的条件$["*client*" in a`extraData;;]
但不起作用。
所以我的目标是删除这两个值。如果只有一个,删除那个,如果两个都删除。
答案 0 :(得分:4)
我首先编写一对函数来将字符串转换为映射并返回:
ms:(!)."S=;"0:
sm:{";"sv"="sv/:flip(string key x;value x)}
在您的数据上,它的工作原理如下:
q)ms "xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie"
xxx | "xxxx"
bbbb | "bbbb"
client | "xxxx"
Account| "oooo"
ffaijo | "efaie"
q)sm ms "xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie"
"xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie"
现在,用
a:([]extraData:enlist "xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie")
您可以按如下方式进行更新:
q)update sm each upsert[;`client`Account!("yyyy";"pppp")] each ms each extraData from a
extraData
----------------------------------------------------------
"xxx=xxxx;bbbb=bbbb;client=yyyy;Account=pppp;ffaijo=efaie"
答案 1 :(得分:2)
你可以添加一个if语句来检查是否存在必要的密钥(可能是一个更好的解决方案):
q)tab:([]extraData:("xxx=xxxx;bbbb=bbbb;client=xxxx;Account=oooo;ffaijo=efaie";"xxx=xxxx;bbbb=bbbb;Account=oooo;ffaijo=efaie"))
q)update {if[not x like "*client*";:x];";"sv @[s;where (s:";"vs x) like "client=*";:;enlist""]}each extraData from tab
extraData
-----------------------------------------------
"xxx=xxxx;bbbb=bbbb;;Account=oooo;ffaijo=efaie"
"xxx=xxxx;bbbb=bbbb;Account=oooo;ffaijo=efaie"
答案 2 :(得分:0)
此
update {";"sv s@(til count s)except where(s:";"vs x)like\:"client=*"}'[extraData]from a