KDB+读取CSV时符号列表解析异常的解决方法问询
这个问题在Kdb+读取符号列表格式的CSV时很常见,默认的"S"类型解析逻辑会把单个'解析为空符号``,而不是你想要的空列表()。我给你几个可行的解决思路,你可以根据自己的场景选择:
1. 读取后直接处理数据
这是最简单的方案,先按你原来的方式读取CSV,再把所有解析为空符号``的字段替换成空列表()。
如果你的数据读取后存在csvFile变量里,执行下面的代码就能批量处理所有符号列:
// 遍历每一列,把空符号转为空列表 csvFile: {if[x ~ `; (); x]} each csvFile;
如果只想处理特定列(比如col2),可以用定向更新:
csvFile: update col2: if[col2 ~ `; (); col2] from csvFile;
这个方案的优点是不需要修改CSV内容,也不用调整读取逻辑,适合快速解决问题。
2. 自定义解析逻辑(不依赖默认"S"类型)
如果你的符号列表格式比较复杂,或者需要更灵活的解析规则,可以先把CSV按字符串读取,再自己写解析函数处理符号列表。
先按字符串类型读取CSV:
csvStr: 1!("CCC"; enlist ",") 0: hsym `$"\\\\location\\of\\csv";
然后定义一个解析字符串到符号列表的函数:
parseSymList: { // 处理CSV中表示空列表的情况(比如写成'') if[x = "''"; :()]; // 处理单个符号(比如'a') if[x like "'*'"; :enlist `$1_-1_x]; // 处理多个符号的情况(比如'a'b'c) parts: split[;"'"] 1_-1_x; `$each parts where not "" = parts };
最后把这个函数应用到需要解析的列上:
csvFile: update col1: parseSymList each col1, col2: parseSymList each col2 from csvStr;
这个方案需要你把CSV中表示空列表的字段写成''(而不是单个'),这样解析函数能准确识别并返回()。
3. 修改CSV格式配合简化读取
如果你能修改CSV的内容,可以把表示空列表的字段留空,然后读取后做简单替换:
比如CSV内容改成:
'a'b'c,
然后按原来的方式读取后,执行替换:
csvFile: 1!("SSS"; enlist ",") 0: hsym `$"\\\\location\\of\\csv"; csvFile: update col2: ?[col2 = `(); (); col2] from csvFile;
这里Kdb+会把空字段解析为空符号``,我们只需要把它换成()就可以了。
内容的提问来源于stack exchange,提问作者Frikster
相关产品推荐
相关产品推荐

