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

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

VARZeeK 13-11-2012 20:03 2025041

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

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

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

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

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

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

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

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

Help :(

Iska 14-11-2012 00:45 2025240

VARZeeK, кодировка файлов?

VARZeeK 14-11-2012 02:18 2025267

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

Iska 14-11-2012 08:39 2025336

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

megaloman 14-11-2012 13:20 2025440

Вложений: 1
Исходный текст и текст на замену содержат пробелы? Длина текста может быть разная? Вообще-то Вы не написали, откуда берутся тексты (исходные и замена). Как вариант, Ваши тексты удобно было бы иметь в двух столбцах таблицы 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 2028231

Вложений: 1
Доброго времени суток!
Есть 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 2028238

Цитата:

Цитата a_aforkin
столбцы со 2ого по 8 »

А в примере — в третьего.

Цитата:

Цитата a_aforkin
в соответствующую строку. »

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

a_aforkin 19-11-2012 14:58 2028255

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

Iska 19-11-2012 15:03 2028257

Цитата:

Цитата a_aforkin
номер строки определяет число первого столбца, н-р 0000000001. »

a_aforkin, я имел в виду: мы тупо дописываем из первой строки второго файла в первую строку первого файла, из второй строки второго файла во вторую строку первого файла, из третьей строки — в третью строку, из строки N — в строку N? Либо же мы связываем файлы по значениям первых трёх столбцов, а на порядок строк внимания не обращаем?

a_aforkin 19-11-2012 15:12 2028264

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

Iska 19-11-2012 16:04 2028290

Если без проверок — то вот Вам примерная болванка кода:
читать дальше »
Код:

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 2028337

Спасибо то что нужно, только подправил строчку

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

Iska 19-11-2012 17:37 2028373

Маразм. маразм… a_aforkin, спасибо, поправил.


Время: 13:02.

Время: 13:02.
© OSzone.net 2001-