Компьютерный форум 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=295586)

iccup.platoon@vk 16-02-2015 01:35 2471742

Сохранение определенной стены текста.
 
Есть файл 1.txt, содержащий многа html кода. Нужно сохранить весь текст, начиная со строки <h1>Admin log</h1> до строки <!--end Tourneys-->
Сами указанные строки сохранять не надо.
Путь для сохранения - D:\logs\%текущий_год%\%текущий_месяц%\%текущий_день%\%текущее_время%.txt с проверкой существования всего пути (если нет - Create).
Вот =)

Iska 16-02-2015 06:41 2471761

Цитата:

Цитата iccup.platoon@vk
Нужно сохранить весь текст, »

Текст или html-код?

P.S. Что мешает сохранить «ручками»? Для чего нужна автоматизация?

iccup.platoon@vk 16-02-2015 12:18 2471901

HTML, да. Автоматизация нужна потому, что каждые 30 секунд будет появляться файл, который нужно будет обработать. Управляющая программа поддерживает VBS, и я переработаю скрипт (если он будет) под ее API. Выше я описал то, что самостоятельно решить не могу. Были идеи читать весь текст и посредством Mid() и InStr(text, "<h1>Admin log</h1>")...

Iska 17-02-2015 10:38 2472378

Цитата:

Цитата iccup.platoon@vk
Были идеи читать весь текст и посредством Mid() и InStr(text, "<h1>Admin log</h1>")... »

Так и есть. Читать потребуется весь текст. Извлекать удобнее будет посредством регулярного выражения.

Упакуйте образец файла в архив. Выложите архив на RGhost. Ссылку — сюда.

iccup.platoon@vk 18-02-2015 06:15 2472709

http://rghost.ru/6ShRRcRJJ

Iska 18-02-2015 07:17 2472723

iccup.platoon@vk, попробуйте так:
Скрытый текст
Код:

Option Explicit

Dim strSourceFile

Dim dtNow
Dim strDestFile

Dim objFSO
Dim strContent


strSourceFile = "E:\Песочница\0433\transfer.txt"

dtNow = Now()

strDestFile = _
        Join( _
                Array( _
                        "D:\logs", _
                        CStr(Year(dtNow)), _
                        ZeroPadRight(Month(dtNow), 2), _
                        ZeroPadRight(Day(dtNow), 2), _
                        Join( _
                                Array( _
                                        ZeroPadRight(Hour(dtNow), 2), _
                                        ZeroPadRight(Minute(dtNow), 2), _
                                        ZeroPadRight(Second(dtNow), 2) _
                                ), _
                                "_" _
                        ) & ".txt" _
                ), _
                "\" _
        )

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strSourceFile) Then
        With objFSO.OpenTextFile(strSourceFile)
                strContent = StrConvert(.ReadAll(), "windows-1251", "utf-8")
                .Close
        End With
       
        With WScript.CreateObject("VBScript.RegExp")
                .IgnoreCase = True
                .Pattern = "<h1>Admin log</h1>([\s\S]*)<!--end Tourneys-->"
               
                If .Test(strContent) Then
                        strContent = .Execute(strContent).Item(0).Submatches(0)
                       
                        CreateFolderEx objFSO.GetParentFolderName(strDestFile)
                       
                        With objFSO.CreateTextFile(strDestFile)
                                .Write strContent
                                .Close
                        End With
                Else
                        WScript.Echo "Can't find pattern [" & .Pattern & "] in source file [" & strSourceFile & "]."
                        WScript.Quit 2
                End If
        End With
Else
        WScript.Echo "Can't find source file [" & strSourceFile & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
' HKEY_CLASSES_ROOT\MIME\Database\Charset
' cp866, windows-1251, koi8-r, unicode, utf-8, _autodetect
'=============================================================================
Function StrConvert(ByVal strText, ByVal strSourceCharset, ByVal strDestCharset)
        Const adTypeText      = 2
        Const adModeReadWrite = 3
       
       
        With WScript.CreateObject("ADODB.Stream")
                .Type      = adTypeText
                .Mode      = adModeReadWrite
               
                .Open
               
                .Charset  = strSourceCharset
                .WriteText strText
               
                .Position  = 0
                .Charset  = strDestCharset
                StrConvert = .ReadText
               
                .Close
        End With
End Function
'=============================================================================

'=============================================================================
Sub CreateFolderEx(strPath)
        With WScript.CreateObject("Scripting.FileSystemObject")
                If Not .FolderExists(strPath) Then
                        CreateFolderEx .GetParentFolderName(strPath)
                        .CreateFolder strPath
                End If
        End With
End Sub
'=============================================================================

'=============================================================================
Function ZeroPadRight(intValue, intLength)
        ZeroPadRight = Right(String(intLength, "0") & CStr(intValue), intLength)
End Function
'=============================================================================


Исходный файл, как и в выложенном образце, ожидается в кодировке UTF-8 без BOM. Результирующий файл — в кодировке ANSI/1251. В примере путь к исходному файлу задаётся непосредственно в коде (могу переделать, чтобы путь задавался аргументом скрипта).

iccup.platoon@vk 18-02-2015 07:47 2472728

Работает прекрасно.
Еще одно:
Код:

<h1>Admin log</h1>
<div class="clear"></div>
</div>

можно ли вслед за первой вышеуказанной строкой удалять две последующие?
А так же пустые строки в результирующем файле (тестил на том же файле, что скидывал Вам) не желательны - первая и 4 последних. Можно ли их удалить?

Iska 18-02-2015 08:28 2472738

Цитата:

Цитата iccup.platoon@vk
можно ли вслед за первой вышеуказанной строкой удалять две последующие? »

Если они всегда присутствуют в исходном файле, то есть смысл включить их в шаблон поиска. Итак, всегда присутствуют?

Цитата:

Цитата iccup.platoon@vk
А так же пустые строки в результирующем файле (тестил на том же файле, что скидывал Вам) не желательны - первая и 4 последних. Можно ли их удалить? »

Можно.

iccup.platoon@vk 18-02-2015 09:25 2472753

Всегда присутствуют.

Iska 18-02-2015 09:52 2472772

iccup.platoon@vk, замените в вышеприведённом скрипте строку:
Код:

                .Pattern = "<h1>Admin log</h1>([\s\S]*)<!--end Tourneys-->"
на:
Код:

                .Pattern = "<h1>Admin log</h1>\r\n<div class=""clear""></div>[\r\n]*</div>\r\n([\s\S]*\S\r\n)[\r\n]*<!--end Tourneys-->"

iccup.platoon@vk 18-02-2015 10:16 2472779

Одна пустая строка все-равно остается в конце, но это не беда - сам исправлю.
Указанных строк больше не создается - Iska, Вы как всегда а уровне.
Мир Вашему дому. Можно закрывать.

Iska 18-02-2015 10:59 2472794

Цитата:

Цитата iccup.platoon@vk
Одна пустая строка все-равно остается в конце, »

Не остаётся. Пустая строка состоит только из символов конца строки: двух символов, «CrLf», в Windows, или одного — «Lf» в Unix/«Cr» — в MacOS. В нашем же случае этого не наблюдается:
Скрытый текст

— есть не пустая строка, завершающаяся, как и положено, символами конца строки.

Если они Вам категорически мешают, просто уберите «\r\n» из подгруппы:
Код:

                .Pattern = "<h1>Admin log</h1>\r\n<div class=""clear""></div>[\r\n]*</div>\r\n([\s\S]*\S)[\r\n]*<!--end Tourneys-->"


Время: 15:56.

Время: 15:56.
© OSzone.net 2001-