Quick actions

cmd+k|ctrl+k

Navigation

Languages

考勤

Snippet info

Language

Ruby

Visibility

public

Author

jiemnij

Created

2017-03-06T13:44:35Z

Updated

2017-07-15T05:24:49Z

#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