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

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

Sally88 09-12-2011 20:14 1812359

Замена текста с помощью VBScript.
 
Здравствуйте.
Нужна ваше помощь.

В файле text.txt есть строчка с текстом строчка, нужно найти её и добавить в начале, ну например цифру 1, чтобы получилось 1строчка (либо просто заменить строчка на 1строчка).
Но если в этом файле уже есть 1строчка, то наоборот убрать 1, чтобы получилось строчка.

Iska 10-12-2011 08:58 1812584

Sally88, например, так:
Код:

Option Explicit

Const ForReading  = 1
Const ForWriting  = 2


Dim strFile

Dim strFind
Dim strFindPlus

Dim objFSO
Dim objRegExp

Dim strContent

strFile = "E:\Песочница\0099\text.txt"

strFind    = "строчка"
strFindPlus = "1" & strFind

With WScript.CreateObject("Scripting.FileSystemObject")
        If .FileExists(strFile) Then
                Set objRegExp = WScript.CreateObject("VBScript.RegExp")
               
                With objRegExp
                        .IgnoreCase = True
                        .Global    = True
                        .Pattern    = strFindPlus
                End With
               
                With .OpenTextFile(strFile, ForReading)
                        strContent = .ReadAll()
                       
                        .Close
                End With
               
                With .OpenTextFile(strFile, ForWriting)
                        If objRegExp.Test(strContent) Then
                                .Write objRegExp.Replace(strContent, strFind)
                        Else
                                objRegExp.Pattern = strFind
                                .Write objRegExp.Replace(strContent, strFindPlus)
                        End If
                       
                        .Close
                End With
               
                Set objRegExp = Nothing
        Else
                WScript.Echo "File [" & strFile & "] not found"
        End If
End With

WScript.Quit 0


Sally88 10-12-2011 11:47 1812624

Спасибо большое. Все получилось.

Sally88 10-12-2011 12:05 1812629

А если текст который нужно найти и добавить к нему символ, содержит двойные кавычки ( например строчка "01" )

Iska 10-12-2011 12:57 1812652

Sally88, определитесь.

Теперь Вам надо добавлять за шаблоном поиска? Тогда так:
Код:

strFind    = "строчка"
strFindPlus = strFind & " ""1"""

Или Вам именно искать надо по шаблону «строчка "01"» и менять на «1строчка "01"»? Тогда так:
Код:

strFind    = "строчка ""1"""
strFindPlus = "1" & strFind


Sally88 10-12-2011 17:05 1812761

Цитата:

Цитата Iska
Или Вам именно искать надо по шаблону «строчка "01"» и менять на «1строчка "01"»? Тогда так: »

Да, именно так. Я просто не очень точно выразился, хорошо что вы поняли. Еще раз, спасибо за помощь.

Sally88 13-12-2011 19:55 1814596

И снова я. День добрый.
Что нужно поменять в скрипте, чтобы нужный мне символ добавлялся не в начале искомого слова, а в начале строчки содержащей искомое слово?

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

И в догонку такая ситуация. Допустим, файле есть две строчки с искомым словом. Но одна уже содержит символ который необходимо добавить, а в начале второй его нет.
Необходимо добавить его к строчкам где его нет и убрать у строчек где он есть.

megaloman 13-12-2011 22:38 1814711

Использую похожую тему.
Код:

fName = "D:\Delete\111.txt"                    ' Где текстовый файл

tStrok = "домино"                              ' Что ищем в строке текста
bStrok = "1"                                    ' Что вставляем/удаляем в начале найденной строки

Set FSO = CreateObject("Scripting.FileSystemObject")

Set F = FSO.OpenTextFile(fName, 1, False)      ' Открываем исходный текст файл для чтения
AllTxt = F.ReadAll()                            ' Cчитываем весь файл в строковую переменную
F.Close                                        ' Закрываем файл

Mas = Split(AllTxt, vbCrLf)                    ' Разбиваем полученную строку в массив. Резделитель - конец строки и перевод строки vbCrLf
N = UBound(Mas)

LtStrok = LCase(tStrok)                        ' Преобразуем иском подстроку к ниж регистру
LbStrok = LCase(bStrok)                        ' Преобразуем вставляем/удаляем подстроку к ниж регистру

ii = Len(bStrok)

For i = 0 To N
    LMas = LCase(Mas(i))                        ' Преобразуем строку к ниж регистру
    If InStr(1, LMas, LtStrok, 1) <> 0 Then      ' Если подстрока найдена
        If InStr(1, LMas, LbStrok, 1) = 1 Then    ' Если в начале строки есть удаляемая подстрока
            Mas(i) = LTrim(Mid(Mas(i), ii + 1))
        Else
            Mas(i) = bStrok + " " + Mas(i)
        End If
    End If
Next

AllTxt = Join(Mas, vbCrLf)                  ' Консолидируем массив в строку для записи
   
Set F = FSO.OpenTextFile(fName, 2, False)  ' Открываем исходный файл для записи
F.Write AllTxt                              ' Записываем полученное на место исходного файла
F.Close                                    ' Закрываем файл

Поиск слова ведётся вне зависимости от регистра. Недостаток - я не определяю, что такое слово, я практически ищу подстроку в строке, то есть скрипт одинаково обработает строку со словом домино и, например, доминошка

Sally88 14-12-2011 18:59 1815243

Проверил, скрипт отрабатывает как нужно.

Спасибо за ваше решение, да еще с комментариям.

Sally88 15-12-2011 19:15 1816005

megaloman
А можно в скрипт добавить исключение. Чтобы он не модифицировал подходящие по критериям строчки, но содержащие исключающее слово.


Например исключающее слово "другое".
Тогда вот в таком списке...

кино, домино
1 кино, домино, вино
кино, домино, вино
кино, домино, вино и другое.

...должны модифицироваться все строчки, кроме последней, содержащей слово "другое".

megaloman 16-12-2011 10:04 1816324

Код:

fName = "D:\Delete\111.txt"                    ' Где текстовый файл

tStrok = "домино"                              ' Что ищем в строке текста
bStrok = "1"                                    ' Что вставляем/удаляем в начале найденной строки
eStrok = "другое"                              ' С этим словом строки не меняем


Set FSO = CreateObject("Scripting.FileSystemObject")

Set F = FSO.OpenTextFile(fName, 1, False)      ' Открываем исходный текст файл для чтения
Mas = Split(F.ReadAll(), vbCrLf)                ' Cчитываем весь файл в строковую переменную Разбиваем полученную строку в массив. Резделитель - конец строки и перевод строки vbCrLf
F.Close                                        ' Закрываем файл

N = UBound(Mas)

LtStrok = LCase(tStrok)                        ' Преобразуем иском подстроку к ниж регистру
LbStrok = LCase(bStrok)                        ' Преобразуем вставляем/удаляем подстроку к ниж регистру
LeStrok = LCase(eStrok)                        ' Преобразуем исключение подстроку к ниж регистру

ii = Len(bStrok)

For i = 0 To N
    LMas = LCase(Mas(i))                                                                ' Преобразуем строку к ниж регистру
    If InStr(1, LMas, LtStrok, 1) <> 0 And InStr(1, LMas, LeStrok, 1) = 0 Then          ' Если подстрока найдена а исключения нет
        If InStr(1, LMas, LbStrok, 1) = 1 Then                                          ' Если в начале строки есть удаляемая подстрока
            Mas(i) = LTrim(Mid(Mas(i), ii + 1))
        Else
            Mas(i) = bStrok + " " + Mas(i)
        End If
    End If
Next

Set F = FSO.OpenTextFile(fName, 2, False)  ' Открываем исходный файл для записи
F.Write Join(Mas, vbCrLf)                  ' Консолидируем массив в строку для записи Записываем полученное на место исходного файла
F.Close                                    ' Закрываем файл


Sally88 18-12-2011 21:56 1817589

Большое спасибо что помогаете мне.
Но к сожалею возникла острая потребность еще в одном скрипте.

В файле file.txt, есть строчка

кино, шахматы, вино

нужно найти эту строчку по слову кино и заменить в ней шахматы на домино. Но если в этой строчке домино, то наоборот, заменить на шахматы. Без исключений.

Roman3D 11-05-2018 17:04 2813224

Ситуация следующая - есть файл (html), в нём много всего и есть строка с параметрами, в которой нужно менять номер. Строка выглядит примерно так -

...xxxxxxxxxx=336480(xxxxx...

Из постоянных ориентиров:
- имя файла (index.html)
- знак равно "=" перед номером
- левая кавычка "(" после номера
- постоянное расположение первой цифры номера (10-я строка, 57-е знакоместо).

Код:

<!DOCTYPE html>
<html>
<head>

<script type="text/javascript">
    (function() {
        var procs = document.createElement('script');
        procs.type = 'text/javascript';
        procs.async = true;
        procs.src = '357gsb5h78bf470v3xb5dn4s/vt/3n7did=336480(43yhsrt656hbvxcb6464gh);
        var head = document.getElementsByTagName("head")[0];
        head.appendChild(procs);
    })();
</script>

Гуру скриптов, выручите, больно уж нудно руками вбивать эти номера, иногда таких файлов нужно сделать несколько десятков :(

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

P.S. если это упростит задачу, то можно принять, что номер всегда 6-тизначный. В других случаях буду уже руками править.

Iska 11-05-2018 17:39 2813234

Упакуйте несколько образцов Ваших файлов в архив и приложите к сообщению.

Roman3D 11-05-2018 18:06 2813243

Iska, начало файла я привёл полностью, дальше идёт ещё немного html-разметки и текст. Это как бы не публичная информация, не хотелось бы "светить". Это действительно необходимо?

Iska 11-05-2018 18:21 2813249

Цитата:

Цитата Roman3D
Это действительно необходимо? »

Ну, давайте без свечения. Кодировка файлов какая?

Roman3D 11-05-2018 18:27 2813253

Iska, Notepad++ утверждает, что UTF-8 (без BOM)

Iska 12-05-2018 08:46 2813326

Roman3D, как расположены файлы? Номер один и тот же будет для всех файлов или разные номера для разных файлов? Если разные — есть ли какой-либо принцип, по которому эти номера формируются и сопоставляются файлам?

Roman3D 12-05-2018 14:24 2813361

Iska, файл находится "E:\HTML\index.html"
В него вписывается номер и он заливается на хостинг. Имя всегда одинаково - "index.html".

Т.е. много файлов делать не нужно, запустил скрипт -> вбил номер -> нажал "сохранить" -> скопировал руками файл в нужную папку. И так по кругу. Я так себе представляю.

Самый неприятный момент это открытие файла, выделение мышкой нескольких цифр, не зацепив ничего лишнего, и их замена. Вот этот момент и хотелось бы упростить, а то глаза вытекают :)

Iska 14-05-2018 16:02 2813643

Roman3D, ну, вот, как-то так, навскидку:
Скрытый текст
Код:

Option Explicit

Dim strSourceFile

Dim objFSO
Dim objRegExp

Dim strContent
Dim strText4Replace


strSourceFile = "E:\HTML\index.html"

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

If objFSO.FileExists(strSourceFile) Then
        With objFSO.OpenTextFile(strSourceFile)
                strContent = .ReadAll()
                .Close
        End With
       
        Set objRegExp = WScript.CreateObject("VBScript.RegExp")
       
        objRegExp.Pattern = "^(\s+procs\.src = '.+=)(\d+)(\(.+\);)$"
        objRegExp.MultiLine = True
       
        If objRegExp.Test(strContent) Then
                With objRegExp.Execute(strContent).Item(0).Submatches
                        strText4Replace = Trim(InputBox( _
                                "Found text: " & vbCrLf & vbCrLf & _
                                .Item(0) & vbCrLf & _
                                .Item(1) & vbCrLf & _
                                .Item(2) & vbCrLf & vbCrLf & _
                                "Input text for replace value of [" & .Item(1) & "]", _
                                "Input text for replace value of [" & .Item(1) & "]", _
                                .Item(1) _
                        ))
                       
                        If Len(strText4Replace) > 0 Then
                                strContent = objRegExp.Replace(strContent, "$1" & Replace(strText4Replace, "$", "\$") & "$3")
                               
                                objFSO.CopyFile strSourceFile, objFSO.BuildPath(objFSO.GetParentFolderName(strSourceFile), objFSO.GetBaseName(strSourceFile) & ".bak"), True
                               
                                With objFSO.CreateTextFile(strSourceFile, True)
                                        .Write strContent
                                        .Close
                                End With
                        Else
                                WScript.Echo "Replace cancelled"
                                WScript.Quit 3
                        End If
                End With
        Else
                WScript.Echo "Can't find pattern [" & objRegExp.Pattern & "] in content of source file [" & strSourceFile & "]."
                WScript.Quit 2
        End If
       
        Set objRegExp = Nothing
Else
        WScript.Echo "Can't find sourcefile [" & strSourceFile & "]."
        WScript.Quit 1
End If

Set objFSO = Nothing

WScript.Quit 0


P.S. Нажимать «Сохранить» не нужно :).


Время: 05:54.

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