Найти строку и переформатировать соответственно - PullRequest
0 голосов
/ 13 сентября 2018

Я работал над сценарием VBScript, который находит все файлы с определенным расширением .dat, выполняет поиск по определенному шаблону «Срок выполнения: \ d {8}» и смещает строку в определенном формате.

У меня две проблемы с кодом ниже:

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

Надеюсь, это имеет смысл, это очень специфический сценарий, но я надеюсь, что некоторая помощь поможет понять проблему здесь.

Ниже приведен мой код:

Set fso = CreateObject("Scripting.FileSystemObject")

'newtext = vbLf & "Date Due:" & sub_month & sub_day & sub_year 'the text replacing Date Due:

'the purpose of this script is to format the date after Date Due:, which is currently formatted as YYYYMMDD, to MM/DD/YYYY
'example: Date Date:20180605 should be Date Due:06/05/2018
Set re = New RegExp
re.Pattern = "(\nDate Due:\d{8})" 'Looking for line, Date Due: followed by 8 digits
Dim sub_str 'substring of date due, returns the 8 digits aka the date 12345678
Dim sub_month
Dim sub_day
Dim sub_year
Dim concat_full
re.Global = False
re.IgnoreCase = True

For Each f In fso.GetFolder("C:\Users\tgl\Desktop\TestFolder\").Files
    If LCase(fso.GetExtensionName(f.Name)) = "dat" Then
        text = f.OpenAsTextStream.ReadAll
        sub_str = Mid(text, 10, 8) 'substring of the full line, outputs the 8 digit date
        sub_month = Mid(sub_str, 5, 2) 'substring of the date, outputs the 2 digit month
        sub_day = Mid(sub_str, 7, 2) 'substring of the date, outputs the 2 digit day
        sub_year = Mid(sub_str, 1, 4) 'substring of the date, outputs the four digit year
        newtext = vbLf & "Date Due:" & sub_month & "/" & sub_day & "/" & sub_year 'replaces the text pattern defined above and concatenates the substrings with slashes
        'concat_full = (sub_month & sub_day & sub_year)
        f.OpenAsTextStream(2).Write re.Replace(text, newtext)
    End If
Next

РЕДАКТИРОВАТЬ: При изменении re.Global на True он заменяет каждую строку одним найденным шаблоном.Он должен использовать каждый найденный шаблон как свой собственный, а не первый, который он находит.

1 Ответ

0 голосов
/ 13 сентября 2018

Сделайте свое регулярное выражение более конкретным и используйте группы захвата для извлечения соответствующих подсовпадений:

re.Pattern = "(\nDate Due:)(\d{4})(\d{2})(\d{2})"

затем замените совпадения следующим образом:

re.Replace(text, "$1$4/$3/$2")

$1 - $4 в строке замены - это обратные ссылки на группы захвата в шаблоне (т.е. они заменены соответствующей захваченной подстрокой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...