作者laechan (小太保)
看板mud_sanc
标题[分享] 特定 context 解析
时间Thu Apr 26 10:45:37 2012
理论上应该存在着更好的方法,这里纯粹是土法链钢。
比方有个文字档案如下
CONTEXT alarm_id = 1001
alarm_type = equipment
alarm_level = critical
alarm_text = eqn 1-1-1-1 fault detec
ted. some error accoured.
alarm_time = 2012/04/26 09:00:01 am
CONTEXT alarm_id = 1000
alarm_type = qos
alarm_level = major
alarm_text = tcp/ip package losed.
alarm_time = 2012/04/25 08:59:33 am
若依圣殿的写法
mixed tmps=explode(read_file("/alarm.txt"),"CONTEXT");
先对 CONTEXT 做 explode(split),这可以取得每一段的 alarm
msg,接着各别取出 alarm_id、alarm_type 等。
foreach(tmp in tmps)
{
str = "alarm_id = ";
a = strsrch(tmp,str) + strlen(str);
b = a;
while(1)
{
if(tmp[b..b]=="\n")
break;
b++;
}
// 这样就取得 alarm_id 的范围
alarm_id = tmp[a..b-1];
.
.
}
上面简单的说就是,先判断 "alarm_id = " 这个字串的起始位置
,这时候 tmp[a..a] = "a" 这个字串,加上 strlen(str) 後,就
变成 alarm_id 的第一个字串(也就是 1001 的 "1")
而 b 则让它累加,直到侦测到换行字元 tmp[b..b] == "\n" 为止
,这时 tmp[a..b-1] 就是 "1001"
大部份栏位都可以用这种方式取出,但是像 alarm_text 这种不固
定行数、而且断行断在奇怪地方的(detec 接下行的 ted),我使用
的方法是判断它下一个栏位(它下一栏是固定的 alarm_time)
foreach(tmp in tmps)
{
.
.
str = "alarm_text = ";
a = strsrch(tmp,str) + strlen(str);
b = a;
str2 = " alarm_time = ";
s = strlen(str2);
while(1)
{
if(tmp[b..b+s-1]==str2)
break;
b++;
}
alarm_text = replace(tmp[a..b-1],"\n","");
.
.
}
上面的做法也类似,在 b 的判断部份则是以它下一个参数
"alarm_time" 做为终止字串的判断,藉此取出 alarm_text
的全部内容,并将其换行符号拿掉,这时以 id = 1001 为
例..
alarm_text = "eqn 1-1-1-1 fault detected. some error accoured."
===================================================
--
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 编辑: laechan 来自: 111.81.173.167 (04/26 10:54)
※ 编辑: laechan 来自: 210.61.157.53 (06/12 12:43)