Показать полную графическую версию : Заменить несколько участков текстового файла на иной различный текст
Всем привет. Надеюсь, название темы не слишком корявое.
Нужно в текстовом файле определенные участки заменить на другой текст. Помимо целевого файла, есть текстовый документ, где через пробел (или иной символ в роли разделителя (.,;:|), мне без разницы) прописаны пары "исходный_текст замена", каждая пара на отдельной строке... Либо могу сделать два отдельных файла, в одном стобец исходных текстов, в другом столбец замен.
В общем, скрипт должен брать из этих пар первый текст, находить его в целевом файле и менять на соответствующий (по строке?) текст замены.
В данный момент приходится делать так:
В одном окне открыт текстовый файл с подготовленными парами
исходный1 замена1
исходный2 замена2
исходный3 замена3
исходный4 замена4
...
В другом - целевой файл, в котором, собственно, нужно произвести все эти замены.
И вот я в первом выделяю исходный1, Копировать, во втором Правка-Заменить, вставляю в "Что" исходный1, возвращаюсь в первый файл, выделяю замена1, вставляю во втором в поле замены "Чем", Заменить всё (заменяемые тексты в файле несколько раз повторяются). И так каждый раз... Муторно писец, вы понимаете :( Нужно автоматизировать процесс.
BAT, VBS, ещё что-то, или отдельная программа-утилита, мне совершенно не принципиально.
Друг попробовал на Дельфях реализовать задачу, но утилита почему-то только по 8 штук смогла заменять, все за раз никак...
Help :(
VARZeeK, кодировка файлов?
Iska, ANSI/ISO-8859-1, вроде бы (открыл файлы через браузер, он выбрал её).
А может быть и Windows-1251.
Но кириллицы в этих файлах нет, если что.
Просто я сейчас с ноута, на котором Винда англоязычная, файлы с компа с русской ОС.
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
столбцы со 2ого по 8 »
А в примере — в третьего.
в соответствующую строку. »
«Соответствующая строчка» определяется её номером, или как-то ещё. например по соответствию каких-то столбцов?
a_aforkin
19-11-2012, 14:58
ага всё верно с 3его столбца, номер строки определяет число первого столбца, н-р 0000000001.
Первые 2 столбца в строке имеют описательный характер. с 3 и последующие значения переменных. Тоесть в первый файл надо добавить только значения переменных 2ого файла(так как описательные столбцы одинаковые для соответствующих строк)
номер строки определяет число первого столбца, н-р 0000000001. »
a_aforkin, я имел в виду: мы тупо дописываем из первой строки второго файла в первую строку первого файла, из второй строки второго файла во вторую строку первого файла, из третьей строки — в третью строку, из строки N — в строку N? Либо же мы связываем файлы по значениям первых трёх столбцов, а на порядок строк внимания не обращаем?
a_aforkin
19-11-2012, 15:12
из строки N 2ого файла столбцы 3 по M (последний) — в строку N первого файла начиная со столбца M+1, столбцы c 3 по М второго файла.
И так с каждой соответствующей строкой файлов
Если без проверок — то вот Вам примерная болванка кода:
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)
Маразм. маразм… a_aforkin, спасибо, поправил.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.