格式化经过时间值字符串

时间:2016-10-13 02:04:20

标签: csv vbscript format timestamp

我每天都会收到一个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

1 个答案:

答案 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函数,其中唯一要做的工作是正确格式化值。