Что нового

Задача на строки. Сделать поиск-замену в табличном тексте

Suppir

Продвинутый
Сообщения
967
Репутация
62
Стоит следующая задача. Необходимо выполнить поиск-замену в буфере обмена. Однако буфер обмена содержит не простой текст, а вордовские таблицы. Проблема в том, что эти таблицы разрушаются.

1. Копируем вручную в буфер обмена данные с этой страницы
http://www.krsdstat.ru/public/info/26_04-02_05%20%D0%AD%D0%BA%D1%81%D0%BF%D1%80.%D1%82%D0%BE%D0%BF%D0%BB%D0%B8%D0%B2%D0%BE.htm
2. Производим в буфере обмена поиск-замену с помощью функции StringRegExpReplace().
3. Копируем вручную полученные данные в MS Word или WordPad. При этом таблицы должны обязательно сохраниться.

Возможно ли вообще такое сделать?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Suppir
Я выполнил команду

Код:
$text=ClipGet()
ClipPut($text)


и у меня текст вернулся без таблицы, просто обычный текст. Может Word имеет свой буфер?
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Просто функции ClipGet и ClipPut оперируют простым текстом (без форматирования).


Еще вот такую функцию обнаружил:

Код:
#Include <Clipboard.au3>
_ClipBoard_GetDataEx([$iFormat = 1])


позволяет оперировать данными в буфере в специфических форматах.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir [?]
Возможно ли вообще такое сделать?
Так подойдёт:
Код:
#include <IE.au3>
Opt("WinTitleMatchMode",2)

Dim $sLink = "http://www.krsdstat.ru/public/info/26_04-02_05%20%D0%AD%D0%BA%D1%81%D0%BF%D1%80.%D1%82%D0%BE%D0%BF%D0%BB%D0%B8%D0%B2%D0%BE.htm"
Dim $sPath = @ScriptDir &"\DocumentToWrod.html"

$oIE = _IECreate($sLink)
$oSpans = _IETagNameGetCollection ($oIE, "span")
;~ ConsoleWrite(@extended) ; количество найденного

	For $oSpan In $oSpans
		If $oSpan.innerText = '302,9' Then	; то что ищем.
			; ~~
			; или можно устроить поиск из массива значений с последующей их заменой
			; ~~
			MsgBox(0, "", $oSpan.innerText & " меняем на 400")
			_IEPropertySet($oSpan,"innertext","400") ; меняем на
		EndIf
	Next
	
;~ Сохраняем в файл
$sHTML = _IEDocReadHTML($oIE)
$dFile = FileOpen($sPath,2)
If $dFile = -1 Then Exit
FileWrite($dFile, $sHTML)
FileClose($dFile)

;~ Открываем документ в Word`е
Run("""C:\Program Files\Microsoft Office\Office10\winword.exe""" & @ScriptDir & "\DocumentToWrod.html" )
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Здорово! А можно ли использовать регулярные выражения для поиска и замен?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir сказал(а):
Здорово! А можно ли использовать регулярные выражения для поиска и замен?
Можно. Правда, я в них не силён. :smile:
Код:
For $oSpan In $oSpans
	$sOutput  = StringRegExpReplace($oSpan.innerText, "шаблон поиска", "значение для замены") ; то что ищем.
	_IEPropertySet($oSpan,"innertext", $sOutput) ; меняем на
Next
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Уже намного лучше!

Код:
#include<IE.au3>
Opt("WinTitleMatchMode",2)

Dim $sLink = "http://www.krsdstat.ru/public/info/26_04-02_05%20%D0%AD%D0%BA%D1%81%D0%BF%D1%80.%D1%82%D0%BE%D0%BF%D0%BB%D0%B8%D0%B2%D0%BE.htm"
Dim $sPath = @ScriptDir &"\DocumentToWrod.html"

$oIE = _IECreate($sLink, 0, 0)
$oSpans = _IETagNameGetCollection ($oIE, "span")
;~ ConsoleWrite(@extended) ; количество найденного


For $oSpan In $oSpans
    $sOutput  = StringRegExpReplace($oSpan.innerText, "\s+", " ") ; то что ищем.
    _IEPropertySet($oSpan,"innertext", $sOutput) ; меняем на
Next

   
;~ Сохраняем в файл
$sHTML = _IEDocReadHTML($oIE)
$dFile = FileOpen($sPath,2)
If $dFile = -1 Then Exit
FileWrite($dFile, $sHTML)
FileClose($dFile)

;~ Открываем документ в Word`е
Run("C:\Program Files\Microsoft Office\Office12\winword.exe " & @ScriptDir & "\DocumentToWrod.html" )
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Это всё можно сделать методом «_ClipBoard_*», где то уже вроде обсуждалось...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir
OffTopic:
Я так понимаю, вам нужно автоматизировать обновление данных на хостинге?!
Если так то логичнее сделать GUI где вы будите вносить изменённые данные, и по нажатию кнопки сохранить документ на хостинге будет обновляться!
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
OffTopic:
Garrett, задача - собирать информацию с интернет-сайтов органов власти,
приводить к унифицированному виду и подключать в базу данных.
Причем, желательно делать все автоматом, потому что данных много и вручную практически нереально.



Добавлено:
Сообщение автоматически объединено:

CreatoR [?]
Это всё можно сделать методом «_ClipBoard_*», где то уже вроде обсуждалось...

Я не видел той темы, пытаюсь найти...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR, в тот раз мне так и не удалось решить эту задачу...


Добавлено:
Сообщение автоматически объединено:

Как копировать из интернета в word, я разобрался (спасибо Garrett'у). Однако мне нужно копировать не только из интернета, но и переносить такой текст (с таблицами) из одной программы в другую (не Word).




Осталась следующая задача:

Имеем в буфере обмена некий текст с таблицами. Необходимо сделать в нем поиск-замену с регулярными выражениями и обратно записать в буфер измененный текст. Если получится решить - я буду самым счастливым человеком в нашей пятиэтажке :D
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir
Если вы используете мой пример, то документ с изменёнными данными у вас на компьютере уже есть DocumentToWrod.html, и находится в той же директории где и сам скрипт!
Вы можете использовать его в любой программе, которая понимает html формат!
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Garrett, да, я понял, спасибо.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Например, что-нибудь из этого:

Найти: (№|N)[ °]*(\d)
Заменить на: N $2

Найти:(\d{2,4})\s*г\.?(?!од)
Заменить на:$1 г.

Найти: (ул|г|пос|пер|п|ч|ст|тыс)\.\s*(\S|\d)
Заменить на: $1. $2


Да хотя бы "\s+" на " " (заменить много пробельных символов на один). Главное, чтобы с регулярными выражениями, а не через вордовскую функцию поиска-замены.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Suppir
Проще читать из файла необходимые данные и записать в другой файл в формате другой программы. Если использовать новый файл в виде шаблона, то это проще всего.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
AZJIO, программа не дает возможности сохранять документ в файл. Это вроде интерфейса к БД.
Т.е. мне нужно скопировать из нее в буфер текст с таблицами и вставить в другую программу.
При этом нужно произвести поиски-замены в буфере.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Осталась задача

Имеем в буфере обмена какой-то текст с вордовскими таблицами.
Необходимо произвести замену в буфере обмена с регулярными выражениями
(например $line = StringRegExpReplace($line, " +", " ")
При этом структура таблиц должна сохраниться.
 

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Читал, читал.. так и не понял - зачем в буфере обмен это делать?
 
Верх