考勤
#coding = utf-8
name = ""
dat = []
date, am, pm, am_cnt, pm_cnt, = [0,0,0,0,0]
am_s, am_e = [ 6*3600 + 30*60, 8*3600 + 30*60] # 上午打卡时间 06:30 - 08:30
pm_s, pm_e = [12*3600 + 30*60, 14*3600 + 30*60] # 下午打开时间 12:30 - 14:30
File.open("xls导出.txt", "r:utf-8") { |f|
f.each { |line|
line.sub!(/ /, "") if /(. .)\t(20..).*/ =~ line #去掉姓名中的空格
if /(.*)\t(20..)-([\d]*)-([\d]*) ([\d]*):([\d]*)/ =~ line #匹配字符串
d = $3.to_i * 12 + $4.to_i #把日期换算成数字天数
t = $5.to_i * 3600 + $6.to_i * 60 #把时间换算成数字秒
if name != $1 && name != "" #如果跟上次的名字不同
dat << [name, am_cnt, pm_cnt, am_cnt+pm_cnt]
am, pm, am_cnt, pm_cnt = [0, 0, 0, 0]
end
name = $1 #刷新一下名字
date, am, pm = [d, 0, 0] if d != date #如果不同日期,清楚一下上下午的状态
ok = "0" #先设置为打卡失败状态
if t >= am_s && t <= am_e #判断是否上午正常打卡
ok = "重复打卡" #先设置为重复打卡状态
am, ok, am_cnt = [1, "1", am_cnt+1] if am == 0 #如果该天上午没有成功打过卡,设置为成功打卡
elsif (t >= pm_s && t <= pm_e) #判断是否下午正常打卡
ok = "重复打卡" #先设置为重复打卡状态
pm, ok, pm_cnt = [1, "1", pm_cnt+1] if pm == 0 #如果该天下午没有成功打过卡,设置为成功打卡
end
puts "#{$1}\t#{$2}-#{$3}-#{$4}\t#{$5}:#{$6}\t#{ok}" #打印该次打卡的状态和原字符串(用于校对)
end
}
dat << [name, am_cnt, pm_cnt, am_cnt+pm_cnt] #保存最后一次的匹配状态
dat.each {|x| puts "#{x[0]}\t#{x[1]}\t#{x[2]}\t#{x[3]}"} #打印统计情况
}INFO