#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. Это сработало чудесно! Спасибо, что помогли мне с этим.