前文测试发现,相对其他被测试的大模型,qwen coder和kimi编写的代码底子还是不错的,至少正确解析出了字符串。那为什么数值一个也没解析出来?
查看qwen coder这段代码
char *c_close = strstr(c_end, "</c>");
if (!c_close) break;
char *content = NULL;
char *t_attr = extract_attr_value(c_start, "t=\"");
if (t_attr && strcmp(t_attr, "inlineStr") == 0) {
content = extract_tag_content(c_end, "t");
} else {
content = extract_tag_content(c_end, "v");
}
只要找到inlineStr,就只找t标签不找v标签,为什么每列都能找到inlineStr,因为越界查找了,没有限定找的范围是当前列。修改也简单, 給提取函数增加一个区间结束位置参数,调用时传入列结束位置就可以了,
char* extract_tag_content(char *start, const char *tag_name, char *close) {
static char content[BUFFER_SIZE];
char open_tag[64];
char close_tag[64];
snprintf(open_tag, sizeof(open_tag), "<%s>", tag_name);
snprintf(close_tag, sizeof(close_tag), "</%s>", tag_name);
char *content_start = strstr(start, open_tag);
if (!content_start || content_start>close) return NULL;
content_start += strlen(open_tag);
char *content_end = strstr(content_start, close_tag);
if (!content_end|| content_start>close) return NULL;
int len = content_end - content_start;
if (len >= BUFFER_SIZE) len = BUFFER_SIZE - 1;
strncpy(content, content_start, len);
content[len] = '\0';
return content;
}
....
content = extract_tag_content(c_end, "v", c_close);
if (content==NULL && t_attr && strcmp(t_attr, "inlineStr") == 0) {
content = extract_tag_content(c_end, "t", c_close);
}
修改以后,qwen coder的代码输出就正确了
./qw sheet13.xml
1,1,15519,785,1,17.00,24386.67,0.04,0.02,N,O,35137.0,35107.0,35146.0,DELIVER IN PERSON,TRUCK,to beans x-ray carefull
再看kimi代码,相同的出错现象后面是同样的错因,这次让他自己改,也基本改对了,为什么说基本,因为数值列没取到
./kimi sheet13.xml
1,,,,,,,,,N,O,,,,DELIVER IN PERSON,TRUCK,to beans x-ray carefull
原因是没改全, kimi判断inlineStr是否找到用了个技巧把字符指针转成整数,但是忽略了找的范围是当前列,把原句注释掉改成下面的,也正确了
//int is_inline = !!strstr(c, inlineStr);
int is_inline = 0;
char * cin=strstr(c, inlineStr);
if(cin!=NULL && cin<c_next)
is_inline = 1;
输出如下
./kimi sheet13.xml
1,1,15519,785,1,17.00,24386.67,0.04,0.02,N,O,35137.0,35107.0,35146.0,DELIVER IN PERSON,TRUCK,to beans x-ray carefull
再比较效率,qwen coder的代码效率较高,kimi的就呵呵了。
time ./qw lineitem/xl/worksheets/sheet1.xml >tmp.csv
real 0m16.247s
user 0m1.819s
sys 0m0.834s
time ./kimi lineitem/xl/worksheets/sheet1.xml >tmp2.csv
^C
real 2m20.696s
结合代码量kimi 118行,3,414 字节,而qwen coder 200行,6,198 字节。所以高效的代码还是需要相对复杂的处理的。
338

被折叠的 条评论
为什么被折叠?



