Skip to content

Commit e2be54f

Browse files
committed
Create workhour
1 parent 1265781 commit e2be54f

File tree

1 file changed

+137
-0
lines changed

1 file changed

+137
-0
lines changed

workhour

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package main
2+
3+
import "flag"
4+
import "fmt"
5+
import "bufio"
6+
import "os"
7+
import "strconv"
8+
import "strings"
9+
10+
var infile *string = flag.String("i", "before.txt", "Work hours to convert")
11+
var outfile *string = flag.String("o", "after.txt", "Work hours converted")
12+
13+
// 声明一个变量,用来临时记录新一行的数据
14+
var newline string
15+
16+
// 声明一个slice,用他来保存所有新行数据
17+
var newlines []string
18+
19+
/**
20+
* 请手动去掉有请假或迟到、早退的行(这些情况需要特殊处理)
21+
* 计算正常上下班,当天没有请假、早退情况的上班时间(单位:小时),保留到小数点后面两位数字。
22+
* 计算之前的文件请命名为before.txt,放在该代码同级目录下。
23+
*/
24+
func main() {
25+
// 初始化保存新行数据的slice,由于每个月最多31天,所以给它分配初始大小为31
26+
newlines = make([]string, 31)
27+
28+
flag.Parse()
29+
if infile != nil {
30+
fmt.Println("infile=", *infile, "outfile=", *outfile)
31+
}
32+
33+
// 打开未处理的文件
34+
file, err := os.Open(*infile)
35+
if err != nil {
36+
fmt.Println("打开文件失败", infile)
37+
return
38+
}
39+
40+
defer file.Close()
41+
42+
br := bufio.NewReader(file)
43+
44+
index := 0
45+
for {
46+
// 每次读取一行,都让新行归位为空
47+
newline = ""
48+
// 读取一行数据
49+
line, isPrefix, readLineErr := br.ReadLine()
50+
51+
if readLineErr != nil {
52+
// 已经读完了
53+
break
54+
}
55+
56+
if isPrefix {
57+
// 行太长了,无法处理,退出程序
58+
fmt.Println("行太长了")
59+
return
60+
}
61+
62+
// 字符数组转为字符串
63+
str := string(line)
64+
// ==============================以后过滤不符合要求的时间(有请假、迟到、早退)
65+
// 按制表符分割一行数据,第0个字符串为日期,第1个数据为上班时间,第2个数据为下班
66+
strs := strings.Split(str, "\t")
67+
68+
// 让新行先记录下日期
69+
newline = strs[0] + " "
70+
71+
// 处理上班时间,根据冒号进行分割,前者为小时,后者为分钟
72+
start := strings.Split(strs[1], ":")
73+
startHour, startHourErr := strconv.Atoi(start[0])
74+
if startHourErr != nil {
75+
// 转换上班小时的时候出错了
76+
fmt.Println("转换上班的小时出现错误")
77+
return
78+
}
79+
80+
startMinute, startMinuteErr := strconv.Atoi(start[1])
81+
if startMinuteErr != nil {
82+
// 转换上班分钟的时候出错了
83+
fmt.Println("转换上班的分钟出现错误")
84+
return
85+
}
86+
87+
// 处理下班时间,根据冒号进行分割,前者为小时,后者为分钟
88+
end := strings.Split(strs[2], ":")
89+
endHour, endHourErr := strconv.Atoi(end[0])
90+
if endHourErr != nil {
91+
// 转换下班小时的时候出错了
92+
fmt.Println("转换下班的小时出现错误")
93+
return
94+
}
95+
96+
endMinute, endMinuteErr := strconv.Atoi(end[1])
97+
if endMinuteErr != nil {
98+
// 转换下班分钟的时候出错了
99+
fmt.Println("转换下班的分钟出现错误")
100+
return
101+
}
102+
103+
// 上班时间转换为小数形式
104+
startFloat := float64(float64(startHour) + float64(startMinute)/60)
105+
// 小数形式的下班时间
106+
endFloat := 0.0
107+
// 由于5:30到6:00是吃饭时间,不计入工时,所以要分情况处理
108+
if endHour < 18 {
109+
// 处于下午5点半到6点之间,相当于17:30下班,也就是下班点为17.5
110+
endFloat = 17.5
111+
} else {
112+
// 6点之后下班,直接减去30/60小时
113+
endFloat = float64(float64(endHour) + float64(endMinute)/60 - 0.5)
114+
}
115+
116+
// 减去1.5小时的中午休息时间就是当天上班时间
117+
currentDayHour := endFloat - startFloat - 1.5
118+
119+
// 将slice倒转过来,让时间从小到大=====================待处理
120+
121+
// 保存新一行数据到slice中currentDayHour
122+
newlines[index] = newline + strconv.FormatFloat(currentDayHour, 'f', 2, 64)
123+
index++
124+
}
125+
126+
// 保存文件
127+
afterFile, afterErr := os.Create(*outfile)
128+
if afterErr != nil {
129+
fmt.Println("创建输出文件失败")
130+
return
131+
}
132+
defer afterFile.Close()
133+
134+
for _, line := range newlines {
135+
afterFile.WriteString(line + "\r\n")
136+
}
137+
}

0 commit comments

Comments
 (0)