最近工作需要,学习C语言,写一个数据解析的脚本,最后终于有点眉目了,记录下劳动成果吧!因为基础很差,所以,仅供参考!
这是自己编的一个数据,一会会上传原文本云盘地址
这个解析主要是两个函数,分为
1、取key和key的地址——>getTitle()
2、根据第一步获取对应key的value——>getTitleInfo()
getTitle():
//获取key的值以及地址
inline void getTitle(char *str){
char tit[MAX_NAS_NUM], val[MAX_NAS_NUM];
char *a = 0, *b = 0, *c = 0;
char *ptr = NULL, *ptr2 = NULL, *ptr3 = NULL;
int i = 0, k = 0;
while (a = strstr(str, "{")) {
bzero(tit, sizeof(tit));
bzero(val, sizeof(val));
if (i == 0) {
i = 1;
strncpy(tit, str, a - str);
string_replace_char(tit, '"', ' ');
string_replace_char(tit, ':', ' ');
string_trim_rn(tit);
printf("tit:%s\n", tit);
getTitleInfo(str, tit, val);
printf("val:\n%s\n", val);
str = a;
} else {
b = a + 1;
for (ptr = b; *b; b++) {
if (*b == '{') {
ptr = b;
strncpy(tit, a + 1, ptr - a - 1);
string_replace_char(tit, '"', ' ');
string_replace_char(tit, ':', ' ');
string_trim_rn(tit);
printf("tit:%s\n", tit);
getTitleInfo(a, tit, val);
printf("val:\n%s\n", val);
str = ptr;
break;
}
if (*b == '}') {
c = b;
ptr = b + 1;
for (ptr2 = ptr; *ptr; ptr++) {
if (*ptr == '{') {
ptr2 = ptr;
strncpy(tit, c + 2, ptr2 - c - 2);
string_replace_char(tit, '"', ' ');
string_replace_char(tit, ':', ' ');
string_trim_rn(tit);
printf("tit:%s\n", tit);
getTitleInfo(c, tit, val);
printf("val:\n%s\n", val);
str = ptr2;
break;
}
if (*ptr == '}') {
ptr2 = ptr + 2;
if (ptr3 = strstr(ptr2, "{")){
strncpy(tit, ptr2, ptr3 - ptr2);
string_replace_char(tit, '"', ' ');
string_replace_char(tit, ':', ' ');
string_trim_rn(tit);
printf("tit:%s\n", tit);
getTitleInfo(ptr2, tit, val);
printf("val:\n%s\n", val);
str = ptr3;
break;
} else {
str = ptr2;
break;
}
}
}
break;
}
}
}
}
return;
}
根据两个大括号的位置,取中间的key,然后发给getTitleInfo()这个函数去解析。
getTitleInfo():
//获取key对应的value
inline void getTitleInfo(char *str, char *title, char *info) {
char *first = 0, *a = 0, *end = 0, *ptr = 0;
int len = strlen(title), i = 0, k = 0;
a = strstr(str, title);
for (ptr = a; *a; a++) {
if (*a == '{') {
if (i == 0) {
ptr = a;
}
i++;
}
if (*a == '}') {
break;
}
}
k = i;
first = ptr;
//printf("first:\n%s\n", first);
for (end = ptr; *ptr; ptr++) {
if (*ptr == '{') {
k--;
}
if (*ptr == '}') {
k++;
}
//printf("k:\n%d\n", k);
if (k == i) {
end = ptr;
//printf("end:\n%s\n", end);
break;
}
}
//printf("end:\n%s\n", end);
//printf("a:\n%s\n", a);
strncpy(info, first + 1, end - first - 1);
return;
}
判断这个key,刚开始对应的 { 有几个,记为i个,然后把i赋值给k,从头开始,
当有 { 时,k--,
有 } 时,k++,
当k == i时,上下位置对应,取这之间的值,就是所谓的key对应的value。
好啦,大体就是这样,代码和数据样本都上传到了云盘上,大家自己看下吧!(*^__^*) 嘻嘻……
地址:
http://pan.baidu.com/s/1i5ggIzF