我正在编写一个程序来帮助我们的人事部门输入薪资。SQL查询输出一个包含如下数据的文件:
1,E,REG,40.0000000
10,E,REG,11.5000000
10,E,REG,11.0000000
10,E,REG,5.5000000
10,E,REG,.0000000
10,E,REG,2.5000000
10,E,REG,3.5000000
10,E,REG,6.0000000
10,E,OT,5.5000000
10,E,OT,9.5000000
在VB中,我创建了一个名为Employee的类
Public Class Employee
Public Property empNo As Integer
Public Property eCode As String
Public Property webCode As String
Public Property hrsWork As Decimal
End Class
我已经能够从文件中获取信息并将其加载到列表中
Dim allEmployees = From line In System.IO.File.ReadLines("C:\file\testout.txt")
Let Columns = line.Split(","c)
Where Columns.Length = 4
Let empNum = Integer.Parse(Columns(0).Trim())
Let eCode = Columns(1)
Let webCode = Columns(2)
Let hrsWrk = Decimal.Parse(Columns(3))
Select New Employee With {.empNo = empNum, .eCode = eCode, .webCode = webCode, .hrsWork = hrsWrk}
Dim EmpList As List(Of Employee) = allEmployees.ToList()
接下来,我需要做的是浏览此列表,并按编号选择各个员工,然后按webCode(REG,OT等)汇总其工作时间。完成此操作后,我需要将它们输出回txt文件,HR可以将其导入我们的薪资系统。
输出文件应如下所示:
1,E,REG,40.0000000
10,E,REG,40.0000000
10,E,OT,15.0000000
整个文件等等。
我真的坚持如何隔离每位员工以继续。有什么建议?
您可以使用循环读取时汇总数据。首先,为了简化循环并根据个人喜好,使Employee
类足够聪明以创建自己:
Public Class Employee
...properties
Public Sub New(items As String())
empNo = Int32.Parse(items(0))
eCode = items(1)
webCode = items(2)
hrsWork = Decimal.Parse(items(3))
End Sub
End Class
该代码将拆分的数据传递给它,并允许它分配值。然后循环:
Dim eList As New List(Of Employee)
Dim line As String
Dim data() As String
Dim EmpId As Int32
Using sr As New StreamReader("C:\Temp\empsql.csv")
Do Until sr.EndOfStream
line = sr.ReadLine
data = line.Split(","c)
EmpId = Int32.Parse(data(0))
' find an emp with matching number and this "webcode"
Dim oldemp = eList.
Where(Function(w) w.empNo = EmpId AndAlso w.webCode = data(2)).
FirstOrDefault()
' if emp does not exist, create one
If oldemp Is Nothing Then
Dim Emp = New Employee(data)
eList.Add(Emp)
Else
' add the current hours
oldemp.hrsWork += Decimal.Parse(data(3))
End If
Loop
End Using
或者,您可以处理创建的原始数据的收集,而不是创建将在以后删除的项目,而不是创建项目,一个额外的步骤使您可以增加已读取任何记录的小时数。测试结果:
For Each emp In eList
Console.WriteLine("{0} {1} {2} {3}", emp.empNo, emp.eCode,
emp.webCode, emp.hrsWork)
Next
结果:
1 E REG 40.0000000 10 E REG 40.0000000 10 E OT 15.0000000
要将其写回,除了在格式字符串中添加逗号并写入文件而不是调试窗口外,您可以执行相同的操作。
请注意,这String.Split
不是解析CSV的理想选择。它可能会因几种常见故障而失败。该TextFieldParser更强劲,看到该链接的一个例子。考虑到来源和内容,您可能是安全的,但值得一提。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句