Формат строки значения прошедшего времени

#csv #vbscript #format #timestamp

#csv #vbscript #формат #временная метка

Вопрос:

Я ежедневно получаю файл CSV, в котором я фильтрую для поиска определенных данных. Этот файл требует много усилий вручную в Excel для фильтрации и форматирования данных. Я разрабатываю VBScript для просмотра каждой строки, чтобы возвращать только данные, необходимые для уменьшения ручного труда.

В файле CSV находится строка «просмотренное время», которая имеет странный формат. Данные «просмотренного времени» отличаются от строки к строке. Примером этих данных является следующее:

3 часа 27 минут 35 секунд
35 минут 20 секунд 8
минут 38 секунд
1день1час25мин 30сек
5 дней 12 часов 9 минут 48 секунд

Я использую этот фрагмент кода, чтобы удалить «дни», «часы», «минуты» и «секунды» из данных и заменить их на «:».

 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

Я хочу, чтобы данные были отформатированы следующим образом, а не так, как сейчас.

 чч: мм: сс
 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" amp; h Else hh = h
    If Len(Trim(m)) = 1 Then mm = "0" amp; m Else mm = m
    If Len(Trim(s)) = 1 Then ss = "0" amp; s Else ss = s

    funcFormatTime = hh amp; ":" amp; mm amp; ":" amp; ss
End Function
  

Ответ №1:

При этом используется регулярное выражение для разделения входных строк с использованием .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" amp; d) * 24   Clng("0" amp; h), 2) amp; ":" amp; _  
                    LeftZeroPad( CLng("0" amp; m), 2) amp; ":" amp; _  
                    LeftZeroPad( CLng("0" amp; s), 2) 
End Function 

Function LeftZeroPad( value, length )
    LeftZeroPad = CStr(value)
    If Len(LeftZeroPad) < length Then 
        LeftZeroPad = Right(String(length, "0") amp; CStr(LeftZeroPad), length)
    End If
End Function
  

Каждый из элементов в регулярном выражении имеет вид

 (?:([0-9] )days)?
  

Где (?: )? означает, что скобки не определяют группу захвата ( ?: ) и что эта группа может или не может присутствовать (закрытие ? ). Внутри этого выражения есть ([0-9] ) , которые определяют группу захвата, которая соответствует последовательности числовых цифр. Группы захвата передаются в качестве аргументов функции replace, где единственная задача — правильно отформатировать значения.

Комментарии:

1. Это сработало чудесно! Спасибо, что помогли мне с этим.