我每天都会收到一个CSV文件,我会在其中过滤以查找某些数据。此文件需要在Excel中进行大量手动操作才能过滤和格式化数据。我正在设计一个VBScript来查看每一行,只返回减少手动工作所需的数据。
在CSV文件中是一个“看时间”的字符串,格式奇怪。 “看到的时间”数据因行而异。此数据的一个示例如下:
3hrs27min 35sec 35min 20sec 8min 38sec 1days1hrs25min 30sec 5days12hrs9min 48sec
我正在使用此代码段从数据中删除“days”,“hrs”,“min”和“sec”,并将其替换为“:”。
strLastField0 = arrFields(9)
strLastField1 = Replace(strLastField0,"min ",":")
strLastField2 = Replace(strLastField1,"hrs",":")
strLastField3 = Replace(strLastField2,"days",":")
strLastField4 = Replace(strLastField3,"sec","")
结果如下:
d:h:m:s 3:27:35 35:20 8:38 1:1:25:30 5:12:9:48
我希望以下列方式格式化数据,而不是现在的格式。
hh:mm:ss 03:27:35 00:35:20 00:08:38 25:01:25 132:09:48
这是我一直在努力实现这一目标的功能,但是我的尝试无法获得我想要的格式。
Function funcFormatTime(TimeString)
Dim TimeArray
Dim h, m, s, hh, mm, ss
TimeArray = Split(TimeString, ":", -1, 1)
d = TimeArray(0)
h = TimeArray(1)
m = TimeArray(2)
s = TimeArray(3)
Do Until s < 60
s = s - 60
m = m + 1
Loop
Do Until m < 60
m = m - 60
h = h + 1
Loop
Do Until h < 24
h = h - 24
Loop
If Len(Trim(h)) = 1 Then hh = "0" & h Else hh = h
If Len(Trim(m)) = 1 Then mm = "0" & m Else mm = m
If Len(Trim(s)) = 1 Then ss = "0" & s Else ss = s
funcFormatTime = hh & ":" & mm & ":" & ss
End Function
答案 0 :(得分:2)
这使用正则表达式使用.Replace
方法将输入字符串与函数指针分开,该函数指针将作为参数接收字符串中的每个元素(如果存在)或Empty
值(如果不存在)
Option Explicit
Dim aStrings
aStrings = Array( _
"3hrs27min 35sec", _
"35min 20sec", _
"8min 38sec", _
"1days1hrs25min 30sec", _
"5days12hrs9min 48sec" _
)
Dim sTime
For Each sTime in aStrings
WScript.Echo funcFormatTime( sTime )
Next
Function funcFormatTime( inputString )
With New RegExp
.Pattern = "^(?:([0-9]+)days)?(?:([0-9]+)hrs)?(?:([0-9]+)min)?(?:\s*([0-9]+)sec)"
funcFormatTime = .Replace( inputString, GetRef("funcCalcTime") )
End With
End Function
Function funcCalcTime( matchedString, d, h, m, s, offset, originalString )
funcCalcTime = LeftZeroPad( CLng("0" & d) * 24 + Clng("0" & h), 2) & ":" & _
LeftZeroPad( CLng("0" & m), 2) & ":" & _
LeftZeroPad( CLng("0" & s), 2)
End Function
Function LeftZeroPad( value, length )
LeftZeroPad = CStr(value)
If Len(LeftZeroPad) < length Then
LeftZeroPad = Right(String(length, "0") & CStr(LeftZeroPad), length)
End If
End Function
正则表达式中的每个元素都具有
形式(?:([0-9]+)days)?
其中(?: )?
表示括号没有定义捕获组(?:
),并且该组可能或不可能存在(结束?
)。在此表达式中,有一个([0-9]+)
,用于定义与数字序列匹配的捕获组。捕获组作为参数传递给replace函数,其中唯一要做的工作是正确格式化值。