1

Тема: VBS:Как провести замену в строке следующей за найденой?

Как тему назвать не знаю, админы поправьте
Жена типа занимается косметикой, попросила сделать сайт - сделал. Но чето не подумал и сделал без СМS, и цены указал явно без переменных. А сейчас надо цены поменять, переделывать все с переменными не хочется (тоже что вручную).Все строки с товарами записаны так:

              <a href="../dlya-muzhchin/product/ohlazhdayuschiy-gel-posle-britya.php" class="product fl" style="background-image:url(../../../images/products/1/7791/4185711/medium_gel.jpg)">
                        <div class="title">Охлаждающий гель после бритья</div>
                        <div class="price fr">420 руб.</div>
                    </a>
                
                    <a href="../dlya-muzhchin/product/ochischayuschee-mylo-mkmen.php" class="product fl" style="background-image:url(../../../images/products/1/7803/4185723/medium_010334.jpg)">
                        <div class="title">Очищающее мыло MKMen</div>
                        <div class="price fr">420 руб.</div>
                    </a>

Вот я нашел строку

<div class="title">Охлаждающий гель после бритья</div>

, а как указать что замену надо провести в след.строке?

2

Re: VBS:Как провести замену в строке следующей за найденой?

Смотря что заменить надо. Целиком весь тег

<div class="price fr">420 руб.</div>

или его свойства или содержиое ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3 (изменено: Rom5, 2013-04-15 13:03:04)

Re: VBS:Как провести замену в строке следующей за найденой?

Может Вам стоит написать пару скриптов: один выгружает содержимое Ваших исходных таблиц - например, в XLS-ный файл (выгружать в строки содержимое тегов с классами "title" и соответствующий им "price fr"), пользователь правит этот файл, а Вы другим скриптом делаете поиски и замены на основании содержимого XLS ?

Или Вам нужен просто vbs-пример работы с текст.файлами? Тогда показывайте, что уже написано.

WBR. Roman

4

Re: VBS:Как провести замену в строке следующей за найденой?

Xameleon пишет:

Смотря что заменить надо. Целиком весь тег

<div class="price fr">420 руб.</div>

или его свойства или содержимое ?

заменить надо только цену(цифры).

я в первом ссобщении написал что например Вот я нашёл строку
<div class="title">Охлаждающий гель после бритья</div>
А как указать что замену надо провести в следующей за ней строке?

Сделал пока только "болванку"

'берем название товара в price_txt и ищем строку с этим товаром в файлах папки 


price_txt = "c:\price.txt"        'файл price
papka = "C:\77777777777\"            'папка поиска


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set file1 = objFSO.OpenTextFile(price_txt, 1, False)


While Not file1.AtEndOfStream
word = file1.ReadLine()               ' считываем строку из price_txt   'искомое слово

RecursiveFolderScan papka

Wend

file1.close
Msgbox "ВСЕ!"



Sub RecursiveFolderScan(FolderPath)
    'Получаем объектную модель текущего каталога
    Set Folder = objFSO.GetFolder(FolderPath)
 
    'Перебираем все файлы в текущем каталоге
    For Each File in Folder.Files
'+++++++++++++++++++++++++++++++++++++++++

Set file2 = objFSO.OpenTextFile(File, 1, False)

Do Until file2.AtEndOfStream
sw = file2.ReadLine()

If InStr(1, sw, word) <> 0 Then    'вот мы нашли нужную строку

'а теперь надо перейти на следующюю строку и сделать в ней замену
                
            End If
        Loop
file2.close

    Next
 
    'Перебираем все подкаталоги в каталоге
    For Each SubFolder in Folder.SubFolders
        RecursiveFolderScan(SubFolder.Path)
    Next
End Sub

5 (изменено: Rom5, 2013-04-15 22:26:54)

Re: VBS:Как провести замену в строке следующей за найденой?

я в первом ссобщении написал что например Вот я нашёл строку
<div class="title">Охлаждающий гель после бритья</div>
А как указать что замену надо провести в следующей за ней строке?

После Вашего успешного сравнения - еще раз считать в переменную строку из файла той же командой

sw = file2.ReadLine()

потом в переменной с содержимым, например, "<div class="price fr">420 руб.</div>" ищите позиции внутренних угловых скобок, и меняете в переменной sw текст на свой новый


sNewPrice = "456 руб." ''''''' пример того, на что собрались менять
iPos1 = InStr(sw, ">")
iPos2 = InStrRev(sw, "<") 'ищем первую скобку справа'
'''' если sNewPrice (цена новая) без текста " руб.", то 
' iPos2 = InStr(iPos1, sw, " ") 'либо ищем пробел после первой скобки '
' iPos2 = InStr( sw, " руб.") 'либо ищем фразу "про рубли" '

'формируем строку для вывода в файл из 3-х частей'
sw = Left(sw, iPos1 ) & sNewPrice & Right(sw, Len(sw) - iPos2 + 1)

'выводите в новый файл переменную sw уже за пределами сравнения поиска строки названия продукта, 
'но перед Loop
' (!) не забудьте сделать такой же вывод в новый файл значения переменной sw выше по коду - перед 
'   дополнительным "считыванием следующей строки"

Кстати, по Вашему коду я не понял - а где же берется новая цена?
Привели бы уже образец своего "c:\price.txt", т.к. могут быть нюансы и по самому поиску названия продукта -я бы к искомой фразе добавил бы спереди и сзади угловые скобки, для однозначного поиска строки...

А замена в файле как правило выглядит как создание совершенно нового файла, в который выводятся все считываемые строки - и неизменяемые значения sw, и откорректированные.

----
Файл прежний перед считыванием его значений можно переименовывать в .bak, а создаваемому - давать имя прежнего. В таком случае в цикле обхода всех файлов надо еще и проверять имя на наличие в нем .bak для пропускания уже обработанных файлов.
(и я не сильно представляю как себя будет вести "обход" файлов каталога, если в нем появляются в процессе работы новые файлы, возможно нужно при входе в каталог создать массив списка имен обрабатываемых файлов и делать цикл открытия файлов уже по своему массиву)

WBR. Roman

6 (изменено: griha09, 2013-04-16 02:54:07)

Re: VBS:Как провести замену в строке следующей за найденой?

Большое спасибо, Rom5, чето вообще ступил что надо просто еще раз прочитать sw = file2.ReadLine()

А где же берется новая цена?   До этого вопроса я еще не дошел
Сейчас решаю как сделать - есть три варианта структуры price.txt
Вариант 1:
Наименование;Стоимость

Вариант 2:
Наименование
Стоимость

Вариант 3
Наименование - в price.txt
Стоимость - в price2.txt

По-моему вариант 2 самый простой: тогда пишем так


If InStr(1, sw, word) <> 0 Then    'вот мы нашли нужную строку
sw = file2.ReadLine()
word = file1.ReadLine() 
               
          

ну и дальше уже выделять цену из строки sw, у лучше и проще наверное строки в price.txt записывать в виде <div class="price fr">420 руб.</div> и делать полную замену строки sw на строку word. Строковая функция Replace(expr, find, replacewith[, start[, count[, compare]]]) для этого подойдет?

7

Re: VBS:Как провести замену в строке следующей за найденой?

Я бы сделал примерно так. Как это работает подробно описал здесь.
В случае наличия какого-нибудь планшетника или телефона с приложением Google Drive "жена" cможет менять цены в процессе поездки в трамвае например, и про этот вопрос можно будет благополучно забыть .

8

Re: VBS:Как провести замену в строке следующей за найденой?

griha09 пишет:

Сейчас решаю как сделать - есть три варианта структуры price.txt
Вариант 1:
Наименование;Стоимость

Вариант 2:
Наименование
Стоимость

Вариант 3
Наименование - в price.txt
Стоимость - в price2.txt

По-моему вариант 2 самый простой: тогда пишем так


If InStr(1, sw, word) <> 0 Then    'вот мы нашли нужную строку
sw = file2.ReadLine()
word = file1.ReadLine() 

Но код-то Вы привели к варианту-3 - с одного файла читаете наименование, а с другого - цену:)

Я считаю самым приемлемым - вариант-1 - разрывать справочник на два файла(вар-3)  либо зависеть от случайного пропуска какой-то строки, что нарушит весь справочник (вар-2) - чревато и неудобно.

-----
В варианте-1: считанную строку разбиваете на массив из двух элементов по разделителю ";" (см. по функцию "Split()" - Split Function ), полученными двумя значениями массива заполнить "Словарь" - см. Dictionary Object.

Таким образом сначала считываем весь справочник цен в память в словарь, удобство которого - удобный поиск наличия ключа - "Exists Method" (в Вашем случае названия продукта, найденного в корректируемом файле) и получение соответствующего значения по ключу "Item Property " (у Вас - новая цена).



ps. а можно вместо текстового файла использовать эксельную таблицу: колонка с наименованием, колонка с ценой. Править ее пользователю удобно т.к. есть поиск и всякие сортировки и прочие полезности, считывать скриптом - тоже (на машине должен быть установлен Офис с Экселем) - примеры есть на форуме, если не найдете - маякуйте адаптирую какой-то свой скрипт для примера.

WBR. Roman

9

Re: VBS:Как провести замену в строке следующей за найденой?

dab00 пишет:

Я бы сделал примерно так. Как это работает подробно описал здесь.

Ваши примеры для меня слишком сложны, я вообще ничего не понял.

dab00 пишет:

В случае наличия какого-нибудь планшетника или телефона с приложением Google Drive "жена" cможет менять цены в процессе поездки в трамвае например, и про этот вопрос можно будет благополучно забыть .

Да лениво ей самой делать, она уже полгода собирается их поменять. Просто мне уже самому стало интересно как это сделать скриптом?