Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/19: Рейтинг темы: голосов - 19, средняя оценка - 4.53
20 / 9 / 3
Регистрация: 02.04.2015
Сообщений: 646
1

Массовая замена слов

25.03.2020, 12:24. Показов 3596. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую господа!

Скажите может у кого есть программа на c++ под такую задачу,
есть много файлов с расхирением .php
(1.php, 3.php, 7.php и так далее)
именно в них мне нужно произвести замену слов и кусков текста из строки.

к примеру в вашей программе будет два поля (1. что заменить 2. на что заменить)
в поле

1. что заменить, я указываю каждую замену с новой строки (вот так).

меняю это слово или фразу
апбрсч кееусм екнн
смиса авпвке апр


____________________________
2. на что заменить, я указываю на что заменяю с новой строки (вот так).

меняю на это слово или фразу
апбрсч кееусм екнн
смиса авпвке апр



Помогите, может есть у кого-то схожая программа, а то в нотепаде++ все это тоже можно сделать, но там тольно за раз могу сделать замену только одного слова изи фразы на другое слово или фразу, а мне очень нужно пакетное решение так как слов много к замене.
Может можно в нотепаде++ или другой программе все это сделать подскажите тогда как или названия программ, спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2020, 12:24
Ответы с готовыми решениями:

Массовая замена слов, не Ctrl+H
Добрый день. Скорей всего нужен Макрос. Такое дело. Есть столбик с набором слов. примерно 50000...

Массовая замена слов в документе из списка
Доброго времени суток! В документе есть определенные слова, которые нужно заменять на другие....

Массовая замена слов в файлах .txt BAT файлом
Есть BAT файл который выполняет замену слов в конкретном файле. Как его переделать что б он...

Массовая замена
Здравствуйте. Нужно проставить массово в кейвордах ковычки. Как это сделать? Есть: японские или...

22
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
25.03.2020, 13:41 2
Цитата Сообщение от serauto79 Посмотреть сообщение
Может можно в нотепаде++
ёще как можно (и даже с регуляркой):
Массовая замена слов
0
20 / 9 / 3
Регистрация: 02.04.2015
Сообщений: 646
25.03.2020, 15:37  [ТС] 3
Цитата Сообщение от XLAT Посмотреть сообщение
ёще как можно (и даже с регуляркой):
Вы не внимательно прочитали, про нотепад я знаю уже 15 лет и все что вы показали, а у меня вопрос в том чтобы за один прогон заменить несколько сотен разных слов (что заменить и на что заменяю), в этих файлах php, а в нотепаде можно за один прогон по всем файлам заменить только одно слово на другое, а у меня их сотня!

в этом вся и сложность.
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
26.03.2020, 07:44 4
serauto79, если замены должны идти не по очереди, то для каждого очередного поиска (с текущей позиции) придётся:
1) искать все варианты заменяемого
2) выбирать из найденного тот, который встретился раньше
3) заменять
4) новая позиция - сразу после вставленной замены
5) идём в пункт 1

для пункта 1 возмОжна оптимизация: в пункте 4 не забывать найденные элементы, расположенные далее, чтобы не искать их заново
0
20 / 9 / 3
Регистрация: 02.04.2015
Сообщений: 646
26.03.2020, 10:16  [ТС] 5
Замены будут иди по очереди!

Смотрите на (примере) в программе есть 2 колонки
1. что заменить
2. на что заменяет


в первой колонке (1. что заменить) я указываю замены, каждая замена с новой строки...

замена 1
замена 2
замена 3
замена 4


во второй колонке (2. на что заменяет) я указываю на что заменить, каждая замена с новой строки...

на что заменить 1
на что заменить 2
на что заменить 3
на что заменить 4


Количество строк будет всегда равное в обеих колонках, в данном примере 4 строки.

ну а в самой программе выбираю все .php файлы по которым нужно прогнать эти замены.

Добавлено через 1 минуту
Так-что если кто в курсе есть ли в природе такая программа маякните пожалуйста.
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
27.03.2020, 12:37 6
serauto79,
без особых усилий с минимум функционала:
Исходник
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
///----------------------------------------------------------------------------|
/// Замена текста.
/// Демо.
/// Инструкция в Readme.txt архиве.
///----------------------------------------------------------------------------:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
 
///----------------------------------------------------------------------------|
/// struct sCfg
///----------------------------------------------------------------------------:
struct sCfg
{   
    std::vector<std::string> m;
    size_t delta;
    std::string aim_namefile;
    
    std::string& get(size_t n)
    {   return m[n+delta];
    }
    
    bool load(const char* const namefile)
    {   cfg_file.open(namefile);
        if (!cfg_file.is_open())
        {   std::cout << "Ошибка чтения файла: \"" << namefile << "\" !\n";
            return false;
        }
        
        getline(cfg_file, aim_namefile);
        
        while(cfg_file.peek() != EOF)
        {   m.push_back("");
            getline(cfg_file, m.back());
        }
        
        cfg_file.close();
        
        delta = m.size()/2;
        return true;
    }
    
    void show()
    {   std::cout << "Всего строк: " << m.size() << "\n";
    
        if(m.size()%2)
        {   std::cout << "WARNING: Количество строк должно быть четным!\n";
            m.pop_back();
        }
        
        std::cout << "Заменить это ----------------------------------------:\n";
        for(int i = 0; i < delta; ++i)
        {   std::cout << i+1  << ".\t";
            std::cout << m[i] << "\n";
        }   std::cout         << "\n";
        
        std::cout << "На это ----------------------------------------------:\n";
        for(int i = 0; i < delta; ++i)
        {   std::cout << i+1          << ".\t";
            std::cout << m[i + delta] << "\n";
        }   std::cout                 << "\n";
    }
    
private:
    std::ifstream cfg_file;
};
 
///----------------------------------------------------------------------------|
/// struct sCfg
///----------------------------------------------------------------------------:
struct sReplace
{   
    sCfg& cfg;
    std::vector<std::string> m;
    sReplace(sCfg& c) : cfg(c)
    {}
    
    void go(const char* const namefile)
    {   if(!load(namefile)) return;
        int count = 0;
        for    (auto& d : m)
        {   for(size_t i = 0; i < cfg.delta; ++i)
            {   if(d == cfg.m[i])
                {   d = cfg.get(i);
                    count++;
                }
            }
        }
        std::cout << "Всего было сделано замен в файле: \"" 
                  << namefile << "\": " << count << "\n";
        save(namefile);
    }
    
private:
    bool load(const char* const namefile)
    {   aim_file.open(namefile);
        if (!aim_file.is_open())
        {   std::cout << "Ошибка чтения файла: \"" << namefile << "\" !\n";
            return false;
        }
        
        while(aim_file.peek() != EOF)
        {   m.push_back("");
            getline(aim_file, m.back());
        }
        
        aim_file.close();
        return true;
    }
    
    void save(const char* const namefile)
    {   std::ofstream fout(namefile);
        for    (auto& d : m)
        {   fout << d << "\n";
        }
        fout.close();
    }
 
    std::ifstream aim_file;
};
 
int main()
{   setlocale(0, "");
     
    sCfg    cfg;
            cfg.load("my.cfg");
            cfg.show();
            
    sReplace rep(cfg);
             rep.go(cfg.aim_namefile.c_str());
             
    std::cin.get();
}


Внимание:
Замена ПОЛНЫХ строк в файла на соответствующие им из my.cfg
Архив с ексешником и тестовыми файлами:
Вложения
Тип файла: rar test.rar (180.1 Кб, 6 просмотров)
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
27.03.2020, 13:02 7
Цитата Сообщение от serauto79 Посмотреть сообщение
ну а в самой программе выбираю все .php файлы по которым нужно прогнать эти замены.
это предстоит добавить.
можно по списку,
а можно все файлы в директории(рекурсивно или без) по маске.

Добавлено через 9 минут
зы:
сори,
там в архиве лежит 1.php уже после теста,
то есть замены там уже все сделаны.
вам придётся самим вдумчиво сделать свой тест:
написать файл назначения и сконфигурировать заменяемые строки.
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
27.03.2020, 16:13 8
Лучший ответ Сообщение было отмечено serauto79 как решение

Решение

Вот более совершенный вариант:
Вложения
Тип файла: rar test.rar (181.9 Кб, 5 просмотров)
1
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.03.2020, 16:25 9
Куча пхп файлов наталкивает на мысль, что там линух. Тогда на хрена изобретать велосипед? Есть sed.
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
27.03.2020, 16:32 10
Цитата Сообщение от avgoor Посмотреть сообщение
Тогда на хрена изобретать велосипед?
Пока два дня ждали ваш ответ можно и самолёт изобрести.
Берём лодку, обклеиваем перьями её, а также обклеиваем и вёсла и опа - самолет готов!
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
27.03.2020, 16:48 11
Цитата Сообщение от XLAT Посмотреть сообщение
Пока два дня ждали ваш ответ можно и самолёт изобрести.
Нормальные программисты после постановки задачи ищут существующие решения.

А самолет изобретать точно не надо. Велосипед хотя бы при использовании относительно безопасен, в отличие от.
0
20 / 9 / 3
Регистрация: 02.04.2015
Сообщений: 646
27.03.2020, 22:07  [ТС] 12
Спасибо XLAT, можно правку внести в исходник
чтобы проход был по маске .php

Чтобы не перечислять названия файлов (это не нужно!)
1.[FILES] <- Сначала перечисляются имена редактируемых файлов.


Я так понимаю, если в директории с программой и конфигами будут находится другие директории а в них файлы .php
по которым нужно прогнать замены все должно работать?

Добавлено через 11 минут
И как по маске прогнать (.php)

Добавлено через 3 минуты
ну и чтобы в подкаталогах делало замены тоже, спасибо большое!
1
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
28.03.2020, 01:14 13
Лучший ответ Сообщение было отмечено serauto79 как решение

Решение

Цитата Сообщение от serauto79 Посмотреть сообщение
по которым нужно прогнать замены все должно работать?
Вот, добавил рекурсивный поиск
(нужно потестить)
это должно работать:
VC++2019 x86
Вложения
Тип файла: rar Замена слов в списке файлов.rar (177.6 Кб, 8 просмотров)
1
20 / 9 / 3
Регистрация: 02.04.2015
Сообщений: 646
28.03.2020, 14:49  [ТС] 14
Теперь все работает как нужно, спасибо большое!

Добавлено через 8 минут
Сечас три замены, но работает медленно, а у меня будет список в 200 замен, и прогнать по всем файлам их тоже много, наверное несколько часов займет?

Добавлено через 1 минуту
но всеровно, спасибо, в любом случае проганять замены через нотепад достаточно муторно.

Добавлено через 4 минуты
Да видно я поспешил с выводами о работе проги, она не работает, сейчас прогнал по всем файлам что у меня есть три замены, так эти файлы до замены весили по 20-30 килобайт, после обработки стали весить по 25 мегобайт, это прикол такой?

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


например была страница пхп с кодом


прапра
апрапрап
ропропр
апрарапр
это замена-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл


то готовый результат после обработки будет у меня такой


прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл
прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл

прапра
апрапрап
ропропр
апрарапр
тут заменил-----------------------
апрапрап
ллрлорлолр
апрарарапр
ролрл


и так у меня выходило с 20 килобайт до 25 мегабайт, там видать серьезно умножало на ноль
1
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
28.03.2020, 15:33 15
serauto79, спасибо.
да нашёл быстро, был глупейший баг,
связанный с грязным контейнером для анализа следующего файла.
Нужно его чистить каждый раз.

Это от того, что на тест я потратил мало времени.

На счёт оптимизаций по времени, кое-что можно сделать, но опять нужно расщедрится временем на тестирование!
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
28.03.2020, 16:20 16
serauto79, исправил этот баг.
Заодно добавил поиск по маске. Поддерживаются '?' и '*'.
Читайте инструкцию в Readme.txt

Напоминаю, что менять можно не только построчно, но и посимвольно в пределах одной строки.

Тестите и пишите исчо баг-репоты - буду исправлять.
Вложения
Тип файла: rar Замена слов в списке файлов.(ver-4).rar (149.0 Кб, 3 просмотров)
0
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
28.03.2020, 18:09 17
Лучший ответ Сообщение было отмечено serauto79 как решение

Решение

по поводу кодировок файла конфига и исходников для замены:
Общая кодировка UTF-8.
Если кодировка будет другая, то возможны траблы.

Соответственно поправленная версия с учетом такого договора:
Вложения
Тип файла: rar Замена слов в списке файлов.(ver-5).rar (364.4 Кб, 7 просмотров)
1
20 / 9 / 3
Регистрация: 02.04.2015
Сообщений: 646
28.03.2020, 19:35  [ТС] 18
ОК, а то я тут с примерами был запилил чтобы показать как работало.
Вложения
Тип файла: rar Replace.rar (126.6 Кб, 1 просмотров)
1
20 / 9 / 3
Регистрация: 02.04.2015
Сообщений: 646
28.03.2020, 20:31  [ТС] 19
Спасибо, теперь все четенько!
1
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
28.03.2020, 21:13 20
serauto79,
Вот тут по оптимизации я чуть-чуть поправил,
насколько хорошо, хз.

Конкретно сделал:
1. в одном месте поменял вектор на лист.
2. зарезервировал под буфера больше места.

это должно помогать избегать временные задержки на перелокацию памяти.

разумеется это мелочь, но всё же профит должен быть.
Вложения
Тип файла: rar Replace(ver-6).rar (315.6 Кб, 7 просмотров)
0
28.03.2020, 21:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2020, 21:13
Помогаю со студенческими работами здесь

Notepad++ массовая замена
Как осуществить массовую замену (удаление) такого вида текста: text1blablabla text2blablalbaaa...

Массовая замена формул
есть столбец с формулами, нужно заменить все значения в столбце с &quot;формула&quot; на...

Массовая замена сылок в БД
Подскажите пожалуйста как в БД заменить все ссылки с кириллицы на латиницу? Поле в БД является...

Массовая замена записей
Добрый день! Подскажите как правильно реализовать массовую замену значений ряда полей? Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru