Войти

Показать полную графическую версию : Замена текста с помощью VBScript.


Sally88
09-12-2011, 20:14
Здравствуйте.
Нужна ваше помощь.

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

Iska
10-12-2011, 08:58
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
Спасибо большое. Все получилось.

Sally88
10-12-2011, 12:05
А если текст который нужно найти и добавить к нему символ, содержит двойные кавычки ( например строчка "01" )

Iska
10-12-2011, 12:57
Sally88, определитесь.

Теперь Вам надо добавлять за шаблоном поиска? Тогда так:
strFind = "строчка"
strFindPlus = strFind & " ""1"""

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

Sally88
10-12-2011, 17:05
Или Вам именно искать надо по шаблону «строчка "01"» и менять на «1строчка "01"»? Тогда так: »
Да, именно так. Я просто не очень точно выразился, хорошо что вы поняли. Еще раз, спасибо за помощь.

Sally88
13-12-2011, 19:55
И снова я. День добрый.
Что нужно поменять в скрипте, чтобы нужный мне символ добавлялся не в начале искомого слова, а в начале строчки содержащей искомое слово?

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

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

megaloman
13-12-2011, 22:38
Использую похожую тему. (http://forum.oszone.net/thread-219197.html) 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
Проверил, скрипт отрабатывает как нужно.

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

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


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

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

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

megaloman
16-12-2011, 10:04
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
Большое спасибо что помогаете мне.
Но к сожалею возникла острая потребность еще в одном скрипте.

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

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

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

Roman3D
11-05-2018, 17:04
Ситуация следующая - есть файл (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
Упакуйте несколько образцов Ваших файлов в архив и приложите к сообщению.

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

Iska
11-05-2018, 18:21
Это действительно необходимо? »
Ну, давайте без свечения. Кодировка файлов какая?

Roman3D
11-05-2018, 18:27
Iska, Notepad++ утверждает, что UTF-8 (без BOM)

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

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

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

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

Iska
14-05-2018, 16:02
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. Нажимать «Сохранить» не нужно :).




© OSzone.net 2001-2012