Войти

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


VARZeeK
13-11-2012, 20:03
Всем привет. Надеюсь, название темы не слишком корявое.

Нужно в текстовом файле определенные участки заменить на другой текст. Помимо целевого файла, есть текстовый документ, где через пробел (или иной символ в роли разделителя (.,;:|), мне без разницы) прописаны пары "исходный_текст замена", каждая пара на отдельной строке... Либо могу сделать два отдельных файла, в одном стобец исходных текстов, в другом столбец замен.
В общем, скрипт должен брать из этих пар первый текст, находить его в целевом файле и менять на соответствующий (по строке?) текст замены.

В данный момент приходится делать так:
В одном окне открыт текстовый файл с подготовленными парами

исходный1 замена1
исходный2 замена2
исходный3 замена3
исходный4 замена4
...

В другом - целевой файл, в котором, собственно, нужно произвести все эти замены.

И вот я в первом выделяю исходный1, Копировать, во втором Правка-Заменить, вставляю в "Что" исходный1, возвращаюсь в первый файл, выделяю замена1, вставляю во втором в поле замены "Чем", Заменить всё (заменяемые тексты в файле несколько раз повторяются). И так каждый раз... Муторно писец, вы понимаете :( Нужно автоматизировать процесс.

BAT, VBS, ещё что-то, или отдельная программа-утилита, мне совершенно не принципиально.

Друг попробовал на Дельфях реализовать задачу, но утилита почему-то только по 8 штук смогла заменять, все за раз никак...

Help :(

Iska
14-11-2012, 00:45
VARZeeK, кодировка файлов?

VARZeeK
14-11-2012, 02:18
Iska, ANSI/ISO-8859-1, вроде бы (открыл файлы через браузер, он выбрал её).
А может быть и Windows-1251.
Но кириллицы в этих файлах нет, если что.
Просто я сейчас с ноута, на котором Винда англоязычная, файлы с компа с русской ОС.

Iska
14-11-2012, 08:39
VARZeeK, тогда упакуйте пару-тройку файлов + «текстовый файл с подготовленными парами» в архив и выложите его на обменник, либо прикрепите к сообщению.

megaloman
14-11-2012, 13:20
Исходный текст и текст на замену содержат пробелы? Длина текста может быть разная? Вообще-то Вы не написали, откуда берутся тексты (исходные и замена). Как вариант, Ваши тексты удобно было бы иметь в двух столбцах таблицы Excel (тогда то, что я спрашиваю, значения не имеет), и в этой таблице можно было бы запустить макрос, который преобразует ваш целевой файл в соответствии с таблицей. Пример такого решения (тестовый текстовый файл и тестовая таблица замены с макросом) в прикрепленном файле. Не проблема переделать макрос в VBS-скрипт, который откроет текстовый файл с заменами. Но надо четче представлять, как разделяются тексты - исходный и замена. Текст макроса прилагаю Sub ReplTxt()

Begin = "A1"
fNameIn = "C:\primer1.txt" ' Исходный текстовый файл
fNameOut = "C:\primer1.txt" ' Файл после обработки. Имя может совпадать с исходным.

i = 0
Do
Ish = Range(Begin).Offset(i, 0)
Zam = Range(Begin).Offset(i, 1)
If Trim(Ish) = "" And Trim(Zam) = "" Then Exit Do
If i = 0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
Set F = FSO.OpenTextFile(fNameIn, 1, False) ' Открываем исходный текст файл для чтения
On Error Resume Next
If Err.Number <> 0 Then
MsgBox CStr(Err.Number) + " " + Err.Description
Exit Do
End If
AllTxt = F.ReadAll() ' Cчитываем весь файл в строковую переменную
F.Close ' Закрываем файл
End If
AllTxt = Replace(AllTxt, Ish, Zam)
''' MsgBox Ish + " " + Zam
i = i + 1
Loop

If i <> 0 Then
Set F = FSO.OpenTextFile(fNameOut, 2, True) ' Открываем выходный файл для записи
F.Write AllTxt ' Записываем полученное
F.Close ' Закрываем файл
End If

End Sub

a_aforkin
19-11-2012, 14:13
Доброго времени суток!
Есть 2 файла содержащие сообщения след характера:
1 файл
0000000001,0000000000,000000,-00155,000155,003906,-07811,003906
0000000002,0000001000,003090,-00175,000119,005805,-07429,001624
0000000003,0000002000,005877,-00178,000073,007136,-06319,-00816
0000000004,0000003000,008089,-00163,000019,007769,-04591,-03177
2файл
0000000001,0000000000,000000,-00166,000177,004606,-07711,003906
0000000002,0000001000,003090,-00166,000177,004605,-07729,001624
0000000003,0000002000,005877,-00166,000078,004636,-06919,-00816
0000000004,0000003000,008089,-00166,000079,0046769,-05691,-03177

Содержат n-ое кол-во строк.
Нужно скопировать и вставить столбцы со 2ого по 8 второго файла в первый в соответствующую строку. Т.е. получить 1 файл следующего содержания.

0000000001,0000000000,000000,-00155,000155,003906,-07811,003906,000000,-00166,000177,004606,-07711,003906
0000000002,0000001000,003090,-00175,000119,005805,-07429,001624,003090,-00166,000177,004605,-07729,001624
0000000003,0000002000,005877,-00178,000073,007136,-06319,-00816,-00166,000078,004636,-06919,-00816
0000000004,0000003000,008089,-00163,000019,007769,-04591,-03177,008089,-00166,000079,0046769,-05691,-03177

Iska
19-11-2012, 14:36
столбцы со 2ого по 8 »
А в примере — в третьего.

в соответствующую строку. »
«Соответствующая строчка» определяется её номером, или как-то ещё. например по соответствию каких-то столбцов?

a_aforkin
19-11-2012, 14:58
ага всё верно с 3его столбца, номер строки определяет число первого столбца, н-р 0000000001.
Первые 2 столбца в строке имеют описательный характер. с 3 и последующие значения переменных. Тоесть в первый файл надо добавить только значения переменных 2ого файла(так как описательные столбцы одинаковые для соответствующих строк)

Iska
19-11-2012, 15:03
номер строки определяет число первого столбца, н-р 0000000001. »
a_aforkin, я имел в виду: мы тупо дописываем из первой строки второго файла в первую строку первого файла, из второй строки второго файла во вторую строку первого файла, из третьей строки — в третью строку, из строки N — в строку N? Либо же мы связываем файлы по значениям первых трёх столбцов, а на порядок строк внимания не обращаем?

a_aforkin
19-11-2012, 15:12
из строки N 2ого файла столбцы 3 по M (последний) — в строку N первого файла начиная со столбца M+1, столбцы c 3 по М второго файла.
И так с каждой соответствующей строкой файлов

Iska
19-11-2012, 16:04
Если без проверок — то вот Вам примерная болванка кода:
Option Explicit

Const ForReading = 1
Const ForWriting = 2


Dim objTSSource1
Dim objTSSource2


With WScript.CreateObject("Scripting.FileSystemObject")
Set objTSSource1 = .OpenTextFile("C:\Песочница\006\Source1.txt", ForReading)
Set objTSSource2 = .OpenTextFile("C:\Песочница\006\Source2.txt", ForReading)

With .OpenTextFile("C:\Песочница\006\Destination.txt", ForWriting, True)
Do Until objTSSource1.AtEndOfStream
.WriteLine objTSSource1.ReadLine() & "," & Split(objTSSource2.ReadLine(), ",", 3)(2)
Loop

.Close
End With

objTSSource2.Close
objTSSource1.Close

Set objTSSource2 = Nothing
Set objTSSource1 = Nothing
End With

WScript.Quit 0

a_aforkin
19-11-2012, 16:54
Спасибо то что нужно, только подправил строчку

.WriteLine objTSSource1.ReadLine() & "," & Split(objTSSource2.ReadLine(), ",", 3)(2)

Iska
19-11-2012, 17:37
Маразм. маразм… a_aforkin, спасибо, поправил.




© OSzone.net 2001-2012