PDA

Показать полную графическую версию : [решено] Сохранение определенной стены текста.


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

Iska
16-02-2015, 06:41
Нужно сохранить весь текст, »
Текст или html-код?

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

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

Iska
17-02-2015, 10:38
Были идеи читать весь текст и посредством Mid() и InStr(text, "<h1>Admin log</h1>")... »
Так и есть. Читать потребуется весь текст. Извлекать удобнее будет посредством регулярного выражения.

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

iccup.platoon@vk
18-02-2015, 06:15
http://rghost.ru/6ShRRcRJJ

Iska
18-02-2015, 07:17
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
Работает прекрасно.
Еще одно:
<h1>Admin log</h1>
<div class="clear"></div>
</div>
можно ли вслед за первой вышеуказанной строкой удалять две последующие?
А так же пустые строки в результирующем файле (тестил на том же файле, что скидывал Вам) не желательны - первая и 4 последних. Можно ли их удалить?

Iska
18-02-2015, 08:28
можно ли вслед за первой вышеуказанной строкой удалять две последующие? »
Если они всегда присутствуют в исходном файле, то есть смысл включить их в шаблон поиска. Итак, всегда присутствуют?

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

iccup.platoon@vk
18-02-2015, 09:25
Всегда присутствуют.

Iska
18-02-2015, 09:52
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
Одна пустая строка все-равно остается в конце, но это не беда - сам исправлю.
Указанных строк больше не создается - Iska, Вы как всегда а уровне.
Мир Вашему дому. Можно закрывать.

Iska
18-02-2015, 10:59
Одна пустая строка все-равно остается в конце, »
Не остаётся. Пустая строка состоит только из символов конца строки: двух символов, «CrLf», в Windows, или одного — «Lf» в Unix/«Cr» — в MacOS. В нашем же случае этого не наблюдается:
http://i.imgur.com/wnnYERS.png
— есть не пустая строка, завершающаяся, как и положено, символами конца строки.

Если они Вам категорически мешают, просто уберите «\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-->"




© OSzone.net 2001-2012