Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Поиск строк в файле и замена их на числа,сгенерированные по маске. (http://forum.oszone.net/showthread.php?t=273614)

galclerik 08-12-2013 16:48 2269027

Поиск строк в файле и замена их на числа,сгенерированные по маске.
 
Всем привет! Есть файл в котором есть много строк формата:

02|56873727|20131207011347|тексттексттекст
02|56873727|20131207011347|тексттексттекст
02|56873727|20131207011347|тексттексттекст (где 2013-год,12-месяц,07-число и 01-час,13-минут,47-секунд)

нужно чтобы батник находил в каждой строке время: 011347 и заменялего на случайное. т.е. задать маски с диапозонами чисел для формирования времени: ([0-2] [0-4]-часы, [0-5] [0-9]-минуты, [0-5] [0-9]-секунды ) .
чтобы в итоге получилось:
02|56873727|20131207134523|тексттексттекст
02|56873727|20131207013515|тексттексттекст
02|56873727|20131207232755|тексттексттекст

Готов отблагодарить финансово!

Спасибо!

Iska 09-12-2013 00:09 2269160

galclerik, образец файла из нескольких строк выложите (нужно опознать кодировку).
Цитата:

Цитата galclerik
([0-2] [0-4]-часы, [0-5] [0-9]-минуты, [0-5] [0-9]-секунды ) . »

И будет что-нибудь наподобие «24 часа 5 минут». И никогда не будет, скажем, ни 5, ни 15 часов ;).

galclerik 09-12-2013 10:06 2269223

Вложений: 1
Вот прикладываю файл! Спасибо за быстрый ответ!

Iska 09-12-2013 12:26 2269277

Ага. UTF-8, без BOM, Unix-like разделители. Длина файла какая бывает (в среднем)?

На WSH:
читать дальше »
Код:

Option Explicit

Dim strSourceFile

Dim lngDayOnSeconds
Dim objRegExp
Dim arrContent
Dim i


If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0) '"E:\Песочница\0335\076"
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If .FileExists(strSourceFile) Then
                        Randomize Timer
                       
                        lngDayOnSeconds = 24 * 60 * 60
                       
                        Set objRegExp = WScript.CreateObject("VBScript.RegExp")
                       
                        objRegExp.Pattern = "^(\d{2}\|\d{8}\|\d{8})(\d{6})(\|.*)$"
                       
                        With .OpenTextFile(strSourceFile)
                                arrContent = Split(.ReadAll(), vbLf)
                                .Close
                        End With
                       
                        For i = LBound(arrContent) To UBound(arrContent)
                                If objRegExp.Test(arrContent(i)) Then
                                        arrContent(i) = objRegExp.Replace(arrContent(i), "$1" & Replace(DateAdd("s", Rnd() * lngDayOnSeconds, 0), ":", "") & "$3")
                                End If
                        Next
                       
                        .CopyFile strSourceFile, .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".bak"), True
                       
                        With .CreateTextFile(strSourceFile, True)
                                .Write Join(arrContent, vbLf)
                                .Close
                        End With
                       
                        Set objRegExp = Nothing
                Else
                        WScript.Echo "Source file [" & strSourceFile & "] not found."
                        WScript.Quit 2
                End If
        End With
Else
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


Можно просто перетаскивать потребный файл на скрипт.

galclerik 09-12-2013 15:23 2269355

Количество строк в среднем достигает 35000.

Подскажи пожалуйста как пользоваться. (установлен windows7/32bit)Путь к папке я поменял, но вот при запуске и перетаскивании пишет "сценарий не указан"

И напиши в личку вебмоней или яндекс, перечислю на пиво, ну или на воду)

Iska 09-12-2013 17:06 2269432

Цитата:

Цитата galclerik
Путь к папке я поменял, »

Где? Там единственный путь, использовавшийся при отладке, и тот закомментирован.


Скопируйте приведённый код и сохраните его в файл с расширением «.vbs». Затем просто перетащите потребный файл на полученный скрипт.

Цитата:

Цитата galclerik
И напиши в личку вебмоней или яндекс, перечислю на пиво, ну или на воду) »

Поскольку я денег принципиально не беру, а администрация, судя по всему, в подобных случаях отклоняет мои переадресации, привожу Вам адрес: Как помочь? | Фонд "Подари жизнь".

galclerik 09-12-2013 17:25 2269445

Спасибо большое! Всё получилось! Только вот как можно доработать скрипт чтобы он также работал если у текста побольше размером строка(концовка после тексттексттекст всегда разная).
Например: 02|56873727|20131207011347|тексттексттекст|1|GFDRW|2|||99597970148|||||P||||||70090280174|32379|EV|| 0000000000|G|||||||||||||||||CDINhh02430||||||INhjtr1|||||+@@+

Iska 09-12-2013 17:39 2269447

Цитата:

Цитата galclerik
(концовка после тексттексттекст всегда разная). »

Я ведь не случайно просил «образец». В начале строк длины частей внутри разделителей хоть стабильны-то?

Я не вижу проблем на предложенной Вами строке: у меня отрабатывает корректно. А у Вас?

galclerik 09-12-2013 17:43 2269451

Вложений: 1
Начало стабильно всегда. Отрабатывает почему-то так:

02|56873727|2013120574408|тексттексттекст
02|56873727|20131205121609|тексттексттекст
02|56873727|2013120535255|тексттексттекст
02|56873727|20131205235414|тексттексттекст
02|56873727|20131205194530|тексттексттекст
02|56873727|2013120565602|тексттексттекст

прикрепил фалы обработки.

Iska 09-12-2013 18:36 2269486

galclerik, интересно было бы посмотреть на региональные стандарты. Исполните следующий код:
читать дальше »
Код:

Option Explicit

Dim i


With WScript.CreateObject("Scripting.FileSystemObject")
        With .CreateTextFile(.BuildPath(.GetParentFolderName(WScript.ScriptFullName), "list.txt"), True)
                For i = 0 To 24 * 60 * 60 - 1
                        .WriteLine DateAdd("s", i, 0)
                Next
        End With
End With

WScript.Quit 0


и выложите в архиве содержимое полученного в результате исполнения файла «list.txt».

galclerik 09-12-2013 20:34 2269562

Вложений: 1
Вы правы,в этом получается и есть проблема что "час" генерируется однозначным числом, а нужно чтобы всегда было двузначное число.

Iska 09-12-2013 21:30 2269596

Давайте проделаем ещё раз то же самое с таким кодом:
читать дальше »
Код:

Option Explicit

With WScript.CreateObject("Scripting.FileSystemObject")
        With .CreateTextFile(.BuildPath(.GetParentFolderName(WScript.ScriptFullName), "list.txt"), True)
                .WriteLine SetLocale("ru")
                .WriteLine DateAdd("s", 1, 0)
               
                .WriteLine SetLocale("en-us")
                .WriteLine DateAdd("s", 1, 0)
                .WriteLine GetLocale()
        End With
End With

WScript.Quit 0


galclerik 09-12-2013 21:48 2269618

Вложений: 1
Вот...

Iska 09-12-2013 22:02 2269628

Мда. Возможно, я настолько привык к тому, что у меня hh:mm:ss, что и не помню, как оно должно быть по умолчанию.

Ладно, давайте будем тупо добавлять впереди «0» и обрезать:
читать дальше »
Код:

Option Explicit

Dim strSourceFile

Dim lngDayOnSeconds
Dim objRegExp
Dim arrContent
Dim i


If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If .FileExists(strSourceFile) Then
                        Randomize Timer
                       
                        lngDayOnSeconds = 24 * 60 * 60
                       
                        Set objRegExp = WScript.CreateObject("VBScript.RegExp")
                       
                        objRegExp.Pattern = "^(\d{2}\|\d{8}\|\d{8})(\d{6})(\|.*)$"
                       
                        With .OpenTextFile(strSourceFile)
                                arrContent = Split(.ReadAll(), vbLf)
                                .Close
                        End With
                       
                        For i = LBound(arrContent) To UBound(arrContent)
                                If objRegExp.Test(arrContent(i)) Then
                                        arrContent(i) = objRegExp.Replace(arrContent(i), "$1" & Right("0" & Replace(DateAdd("s", Rnd() * lngDayOnSeconds, 0), ":", ""), 6) & "$3")
                                End If
                        Next
                       
                        .CopyFile strSourceFile, .BuildPath(.GetParentFolderName(strSourceFile), .GetBaseName(strSourceFile) & ".bak"), True
                       
                        With .CreateTextFile(strSourceFile, True)
                                .Write Join(arrContent, vbLf)
                                .Close
                        End With
                       
                        Set objRegExp = Nothing
                Else
                        WScript.Echo "Source file [" & strSourceFile & "] not found."
                        WScript.Quit 2
                End If
        End With
Else
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


galclerik 09-12-2013 22:47 2269663

Всё работает! Огромнейшее Вам спасибо!!!

galclerik 18-12-2013 12:26 2274261

Добрый день! Подскажите, существует возможность настроить этот скрипт так, чтобы он обрабатывал сразу папку с файлами?

Iska 19-12-2013 06:34 2274759

Цитата:

Цитата galclerik
Подскажите, существует возможность настроить этот скрипт так, чтобы он обрабатывал сразу папку с файлами? »

Нет. Надо переписывать:
читать дальше »
Код:

Option Explicit

Dim strFolder

Dim lngDayOnSeconds
Dim objRegExp
Dim objFile
Dim arrContent
Dim i


If WScript.Arguments.Count = 1 Then
        strFolder = WScript.Arguments.Item(0)
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If .FolderExists(strFolder) Then
                        Randomize Timer
                       
                        lngDayOnSeconds = 24 * 60 * 60
                       
                        Set objRegExp = WScript.CreateObject("VBScript.RegExp")
                       
                        objRegExp.Pattern = "^(\d{2}\|\d{8}\|\d{8})(\d{6})(\|.*)$"
                       
                        For Each objFile In .GetFolder(strFolder).Files
                                If LCase(.GetExtensionName(objFile.Name)) <> "bak" Then
                                        WScript.Echo objFile.Path
                                       
                                        With .OpenTextFile(objFile.Path)
                                                arrContent = Split(.ReadAll(), vbLf)
                                                .Close
                                        End With
                                       
                                        For i = LBound(arrContent) To UBound(arrContent)
                                                If objRegExp.Test(arrContent(i)) Then
                                                        arrContent(i) = objRegExp.Replace(arrContent(i), "$1" & Right("0" & Replace(DateAdd("s", Rnd() * lngDayOnSeconds, 0), ":", ""), 6) & "$3")
                                                End If
                                        Next
                                       
                                        objFile.Copy .BuildPath(objFile.ParentFolder.Path, .GetBaseName(objFile.Name) & ".bak"), True
                                       
                                        With .CreateTextFile(objFile.Path, True)
                                                .Write Join(arrContent, vbLf)
                                                .Close
                                        End With
                                End If
                        Next
                       
                        Set objRegExp = Nothing
                Else
                        WScript.Echo "Folder [" & strFolder & "] not found."
                        WScript.Quit 2
                End If
        End With
Else
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Folder>"
        WScript.Quit 1
End If

WScript.Quit 0


Файлы резервных копий «*.bak» пропускаются при обработке папки.

galclerik 19-12-2013 11:59 2274835

Спасибо!


Время: 05:55.

Время: 05:55.
© OSzone.net 2001-