KDB Q导入CSV时按字符数拆分单列数据求助
KDB/Q 定长文本拆分解决方案
你的问题核心是定长格式文本拆分,不是普通的空格分隔(连续空格对应空列,用split会丢失空列信息),之前用ssr替换空格、sv连接的思路完全不对,正确方法如下:
解决步骤
1. 明确列的字符位置范围
先从示例数据中提取每列的起始/结束索引(KDB/Q中字符串索引从0开始),对应你的示例:
// 定义每列的[起始索引;结束索引] ranges: (0;3);(5;11);(12;17);(18;24);(25;29);(30;32);(33;40);(41;48);(49;55);(56;59);(60;62)
如果实际数据的列位置有调整,直接修改这个范围数组即可。
2. 批量截取并清洗字段
对每行数据按位置截取字段,同时用trim去掉字段前后的空格(空列会自动保留为""):
// 示例输入数据 x: ("EEEE 00000Z AUTO 0000KT 1234 SA 0VC000 0504 Q111 COL RE";"EAAA 00000Z AUTO 0000KT RA 0VC000 Q111 COL RE") // 拆分每行 splitRows: {trim each x@'ranges} each x
3. 转换为带列名的表
给拆分后的字段加上列名,转成KDB表:
// 定义列名 cols: `Col1`Col2`Col3`Col4`Col5`Col6`Col7`Col8`Col9`Col10`Col11 // 生成结果表 result: cols splitRows
执行后result就是你期望的格式:
Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 Col10 Col11 -------------------------------------------------------------------- EEEE 00000Z AUTO 0000KT 1234 SA 0VC000 0504 Q111 COL RE EAAA 00000Z AUTO 0000KT "" RA 0VC000 "" Q111 COL RE
为什么之前的方法错误
ssr[;" ";"";]会把所有空格替换为空,导致所有字符拼接成一串,完全丢失列的边界信息。sv是字符串连接运算符(比如"a" sv "b"返回"ab"),用于合并字符串,不适合拆分场景。
内容的提问来源于stack exchange,提问作者toldmimsy
相关产品推荐
相关产品推荐

