描述
- 给定一个字符串,“第一 10\r\n第一一 2\r\n第一二 3\r\n**第一二一 12.1\r\n*第一二一 b\r\n第二 10”
- 将字符串解析为
[
{
"type": 0,
"id": 0,
"title": "第一",
"description": "",
"write_method": {
"1": 0
},
"max_score": 10,
"items": [
{
"type": 1,
"id": 0,
"title": "第一一",
"description": "",
"write_method": {
"1": 0,
"6": 4096
},
"max_score": 2
},
{
"type": 0,
"id": 0,
"title": "第一二",
"description": "",
"write_method": {
"1": 0
},
"max_score": 3,
"items": [
{
"type": 1,
"id": 0,
"title": "第一二一",
"description": "",
"write_method": {
"1": 0,
"6": 4096
},
"max_score": 12.1
}
]
},
{
"type": 1,
"id": 0,
"title": "第一二一",
"description": "",
"write_method": {
"1": 0,
"6": 4096
},
"max_score": 0
}
]
},
{
"type": 1,
"id": 0,
"title": "第二",
"description": "",
"write_method": {
"1": 0,
"6": 4096
},
"max_score": 10
}
]
方法
方法一
def on_table_setting(aa)
table_setting = []
group_status = []
new_item = Proc.new do |line,pitem=nil|
token=line.split(" ")
score=token.last.to_i
unless score.to_s == token.last
score=token.last.to_f
unless score.to_s == token.last
score = 0
end
end
title = token.first
item = {
:type => 1,
:id => 0,
:title => title,
:description => "",
:write_method => {1 => 0, 6 => 4096},
:max_score => score
}
if pitem
pitem[:items]=[] unless pitem[:items]
pitem[:type]=0 if pitem[:type] ==1
pitem[:write_method].delete(6) if pitem[:write_method].has_key?(6)
pitem[:items].push item
else
table_setting.push item
end
end
new_gitem = Proc.new do |line,lv|
loop do
break if group_status.size <= lv
group_status.pop
end
Sys::Exception.trigger("input error !") if group_status.size < lv
new_item.call(line, group_status.last)
end
get_deep = Proc.new do |line|
lv=0
loop do
break unless line[0] == '*'
line[0,1] =""
lv+=1
end
lv
end
aa.split(/[\r\n]+/).each do |line|
line = line.strip
lv = get_deep.call(line)
if lv == 0
group_status.clear
new_item.call(line)
else
new_gitem.call(line, lv)
end
end
end
str= "第一 10\r\n*第一一 2\r\n*第一二 3\r\n**第一二一 12.1\r\n*第一二一 b\r\n第二 10"
p=on_table_setting(str)