Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kdb 为什么这个if语句不能评估条件?_Kdb - Fatal编程技术网

Kdb 为什么这个if语句不能评估条件?

Kdb 为什么这个if语句不能评估条件?,kdb,Kdb,我处理以下情况: {[x;y]first{[x;y] if[not null first ss[x;raze string[y],"="]; ind:ss[x;raze string[y],"="]; pt1:(first ind)#x; pt2:((first ind)+count[raze string[y],"="]) _ x; pt2:(first

我处理以下情况:

{[x;y]first{[x;y] 
              if[not null first ss[x;raze string[y],"="];
              ind:ss[x;raze string[y],"="];
              pt1:(first ind)#x;
              pt2:((first ind)+count[raze string[y],"="]) _ x;
              pt2:(first ss[pt2;"|"]) _ pt2;
              x:pt1,(string[y],"=test_TAG_",string[.z.P]),pt2];
              :x
           }\[y;x]}[fields;]each a;
因此,代码的作用是:

1. Takes each string a in the form of a fix message "TAG=value|TAG2=value2 ..."
2. Takes variable fields which contains either 1, 2, 3 ...n symbols. 
3. Searches through the string fro the field, finds the index adds value after "=". 
4. [...] keeps doing that until all the values in fields have been depleted
问题是if语句没有检查值。如果它是
0b
1b
它将继续运行并执行
ind:ss[x;raze string[y],“=”]
。为什么会这样

似乎

first {}\[]
实际上导致函数返回初始结果。
Scan
将遍历每个字段,但
first
将丢弃这些字段,并仅返回字符串的第一次迭代

f
{[x;y]{[x;y]
              if[not null first ss[x;raze string[y],"="];
              ind:ss[x;raze string[y],"="];
              pt1:(first ind)#x;
              pt2:((first ind)+count[raze string[y],"="]) _ x;
              pt2:(first ss[pt2;"|"]) _ pt2;
              x:pt1,(string[y],"=test_TAG_",string[.z.P]),pt2];
              :x
           }/[y;x]}
q)a
"1=abc|3=44.4|9=4000"
"1=xyz|3=55.5|5=99|9=2000"
q)fields:1 3 99
q)r:f[fields] each a
q)r
"1=test_TAG_2018.11.06D10:18:14.574411000|3=test_TAG_2018.11.06D10:18:14.574431000|9=4000"
"1=test_TAG_2018.11.06D10:18:14.574447000|3=test_TAG_2018.11.06D10:18:14.574458000|5=99|9=2000"
在下面的语法中使用
over
将允许您执行此操作并返回字符串的最终版本

f
{[x;y]{[x;y]
              if[not null first ss[x;raze string[y],"="];
              ind:ss[x;raze string[y],"="];
              pt1:(first ind)#x;
              pt2:((first ind)+count[raze string[y],"="]) _ x;
              pt2:(first ss[pt2;"|"]) _ pt2;
              x:pt1,(string[y],"=test_TAG_",string[.z.P]),pt2];
              :x
           }/[y;x]}
q)a
"1=abc|3=44.4|9=4000"
"1=xyz|3=55.5|5=99|9=2000"
q)fields:1 3 99
q)r:f[fields] each a
q)r
"1=test_TAG_2018.11.06D10:18:14.574411000|3=test_TAG_2018.11.06D10:18:14.574431000|9=4000"
"1=test_TAG_2018.11.06D10:18:14.574447000|3=test_TAG_2018.11.06D10:18:14.574458000|5=99|9=2000"
根据这些示例,函数似乎正确跳过了未定义的标记(例如上例中的
99
标记)。如果你能提供一个不属于这种情况的例子,也许可以检查一下

此外,在标签匹配方面只有一些bug>

1) 将匹配部分标记,因为如果搜索3,任何以3结尾的标记都将导致匹配

q)a:("1=abc|3=44.4|9=4000";"1=xyz|3=55.5|5=99|9=2000";"1=jkl|33=50|66=0")
q)f[fields] each a
"1=test_TAG_2018.11.06D11:51:09.469637000|3=test_TAG_2018.11.06D11:51:09.469653000|9=4000"
"1=test_TAG_2018.11.06D11:51:09.469666000|3=test_TAG_2018.11.06D11:51:09.469674000|5=99|9=2000"
"1=test_TAG_2018.11.06D11:51:09.469685000|33=test_TAG_2018.11.06D11:51:09.469694000|66=0"
2) 此外,如果匹配的标记位于最后一部分,并且没有结束符
|
,则代码将无法正常工作。这当然取决于消息的结构

q)f[3 9] "1=abc|3=44.4|9=4000"
{[x;y]
...
           }
'type
_
0N
"4000"
应该注意的是,虽然最初将其保留为字符串会更有效,但如果有多个字段,则使用
0:
解析键值对会更快,并将防止上述任何边缘情况的发生。

似乎

first {}\[]
实际上导致函数返回初始结果。
Scan
将遍历每个字段,但
first
将丢弃这些字段,并仅返回字符串的第一次迭代

f
{[x;y]{[x;y]
              if[not null first ss[x;raze string[y],"="];
              ind:ss[x;raze string[y],"="];
              pt1:(first ind)#x;
              pt2:((first ind)+count[raze string[y],"="]) _ x;
              pt2:(first ss[pt2;"|"]) _ pt2;
              x:pt1,(string[y],"=test_TAG_",string[.z.P]),pt2];
              :x
           }/[y;x]}
q)a
"1=abc|3=44.4|9=4000"
"1=xyz|3=55.5|5=99|9=2000"
q)fields:1 3 99
q)r:f[fields] each a
q)r
"1=test_TAG_2018.11.06D10:18:14.574411000|3=test_TAG_2018.11.06D10:18:14.574431000|9=4000"
"1=test_TAG_2018.11.06D10:18:14.574447000|3=test_TAG_2018.11.06D10:18:14.574458000|5=99|9=2000"
在下面的语法中使用
over
将允许您执行此操作并返回字符串的最终版本

f
{[x;y]{[x;y]
              if[not null first ss[x;raze string[y],"="];
              ind:ss[x;raze string[y],"="];
              pt1:(first ind)#x;
              pt2:((first ind)+count[raze string[y],"="]) _ x;
              pt2:(first ss[pt2;"|"]) _ pt2;
              x:pt1,(string[y],"=test_TAG_",string[.z.P]),pt2];
              :x
           }/[y;x]}
q)a
"1=abc|3=44.4|9=4000"
"1=xyz|3=55.5|5=99|9=2000"
q)fields:1 3 99
q)r:f[fields] each a
q)r
"1=test_TAG_2018.11.06D10:18:14.574411000|3=test_TAG_2018.11.06D10:18:14.574431000|9=4000"
"1=test_TAG_2018.11.06D10:18:14.574447000|3=test_TAG_2018.11.06D10:18:14.574458000|5=99|9=2000"
根据这些示例,函数似乎正确跳过了未定义的标记(例如上例中的
99
标记)。如果你能提供一个不属于这种情况的例子,也许可以检查一下

此外,在标签匹配方面只有一些bug>

1) 将匹配部分标记,因为如果搜索3,任何以3结尾的标记都将导致匹配

q)a:("1=abc|3=44.4|9=4000";"1=xyz|3=55.5|5=99|9=2000";"1=jkl|33=50|66=0")
q)f[fields] each a
"1=test_TAG_2018.11.06D11:51:09.469637000|3=test_TAG_2018.11.06D11:51:09.469653000|9=4000"
"1=test_TAG_2018.11.06D11:51:09.469666000|3=test_TAG_2018.11.06D11:51:09.469674000|5=99|9=2000"
"1=test_TAG_2018.11.06D11:51:09.469685000|33=test_TAG_2018.11.06D11:51:09.469694000|66=0"
2) 此外,如果匹配的标记位于最后一部分,并且没有结束符
|
,则代码将无法正常工作。这当然取决于消息的结构

q)f[3 9] "1=abc|3=44.4|9=4000"
{[x;y]
...
           }
'type
_
0N
"4000"

应该注意的是,虽然最初将其保留为字符串会更有效,但如果有多个字段,则使用
0:
解析键值对将更快,并将防止上述任何边缘情况的发生。

正如解析键值对的注意事项一样,您可以使用
0:
,流程已在上解释。谢谢Thomas!但是,这是update语句的一部分。使用
0:
需要我转换为字典,更改值,然后更改回ti fix消息。您确定在If条件下获得0b吗?尝试使用0N打印条件输出!此外,在“if”之后添加一些show语句将有助于检查下一个语句是否执行false case。正如解析键值对的注释一样,您可以使用
0:
,该过程在上进行了说明。谢谢Thomas!但是,这是update语句的一部分。使用
0:
需要我转换为字典,更改值,然后更改回ti fix消息。您确定在If条件下获得0b吗?尝试使用0N打印条件输出!此外,在“if”之后添加一些show语句将有助于检查下一个语句是否执行了false case。