我有这样的文字输入:
AXCGGV-102
A) some data
B) MSGH
E)Check Service MON-TUE 0515-2145 WED-THU 0515-2255
FRI 0515-2145 SAT 0645-1845 SUN 0645-2145
FINISH
AXCGKJ-103
A) some data
B) PBDR
E)Check Service MON-THU 0530-2115, FRI 0530-2000,
SAT 0730-1830, SUN 0730-2115.
FINISH
我想解析这个输入,我想要输出:
MSGH 0515-2145 0515-2145 0515-2255 0515-2255 0515-2145 0645-1845 0730-2115
PBDR ..
以表格格式(即。B)
值和E)
Mon到Sun值)。我想知道如何解析这些数据。
答案 0 :(得分:1)
在此代码中,我假设" E)
"数据全部在一行:
wday = { "MON" => 1, "TUE" => 2, "WED" => 3,
"THU" => 4, "FRI" => 5, "SAT" => 6, "SUN" => 7 }
File.readlines('data').each { |line|
(print $1; next) if line.match(/^B\) (\w+)/)
next if !line.match(/^E\)\s*Check Service\s*(.*)/)
$1.scan(/(\S+) (\d+-\d+)/).each { |days, times|
day1, day2 = days.split '-'
ndays = (wday[day2] || wday[day1]) - wday[day1]
(ndays + 1).times { print " " + times }
}
puts
}
使用您的样本数据输出为:
MSGH 0515-2145 0515-2145 0515-2255 0515-2255 0515-2145 0645-1845 0645-2145
PBDR 0530-2115 0530-2115 0530-2115 0530-2115 0530-2000 0730-1830 0730-2115
这是一个更通用的版本,用于解析" E)
"直到" FINISH
":
wday = { "MON" => 1, "TUE" => 2, "WED" => 3,
"THU" => 4, "FRI" => 5, "SAT" => 6, "SUN" => 7 }
time_data = nil
File.readlines('data').each { |line|
if time_data
(time_data += line; next) if !line.match(/^FINISH/)
time_data.scan(/(\S+) (\d+-\d+)/).each { |days, times|
day1, day2 = days.split '-'
ndays = (wday[day2] || wday[day1]) - wday[day1]
(ndays + 1).times { print " " + times }
}
time_data = nil; puts
next
end
(print $1; next) if line.match(/^B\) (\w+)/)
next if !line.match(/^E\)\s*Check Service\s*(.*)/)
time_data = $1
}