2016-10-13 3 views
0

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

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

3hrs27min 35sec 
35min 20sec 
8min 38sec 
1days1hrs25min 30sec 
5days12hrs9min 48sec

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

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 

ответ

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, где единственная работа, которую нужно выполнить, - это правильно форматировать значения.

+0

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

Смежные вопросы