|
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 111
|
|
Найденную строку заменить определённой строкой из другого файла26.01.2018, 14:09. Показов 5504. Ответов 37
Метки нет (Все метки)
Всем привет!
Моя задача частично решена на CMD/BAT, но скорость работы скрипта делает такое решение неприемлемым. Суть в следующем: Есть два файла 1.txt и 2.txt В файле 1.txt находятся строки в таком виде: Кликните здесь для просмотра всего текста
https://www.youtube.com/watch?v=caCdf94Blfw https://shorten/7Fx1xY https://www.youtube.com/watch?v=Wk6Z7HLpx8s https://shorten/psD1wH https://www.youtube.com/watch?v=JZoO1Ftj-bM https://shorten/LxUaUf https://www.youtube.com/watch?v=_fVUX6-7VKE https://shorten/5WWPDo В одной строке находится ссылка и через один пробел ее сокращенный вариант. Таких строк может быть десятки и сотни тысяч. В файле 2.txt находятся строки в таком виде: Кликните здесь для просмотра всего текста
текст текст текст текст текст текст текст текст текст текст текст текст текст текст
текст текст https://www.youtube.com/watch?v=caCdf94Blfw текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст https://www.youtube.com/watch?v=JZoO1Ftj-bM текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст https://www.youtube.com/watch?v=Wk6Z7HLpx8s текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст https://www.youtube.com/watch?v=_fVUX6-7VKE текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст текст То есть много текста, есть пустые строки, есть строки, которые содержат только пробел(ы). В определённых строка (иногда в начале, иногда внутри или конце текста содержатся ссылки). Если ссылка "внутри" текста, то перед и после ссылки всегда есть один или более пробелов. Необходимо, чтобы скрипт нашёл в файле 2.txt все ссылки и найденные ссылки заменил был сокращённым вариантом, который соответствует полным (не укороченным) ссылками в файле 1.txt. Если для реализации такой задачи необходимо, чтобы ссылки в файле 1.txt располагались как-то по другому, или нужно чтобы они были заключены какими-нибудь тегами, а также если необходимо заключить в теги ссылки в файле 2.txt то это приемлемо. Главное чтобы скрипт работал как можно быстрее, так как строк в обоих файлах может быть десятки и сотни тысяч. Или может кто-то подскажет другое решение моей задачи? P.S. Пока мне посоветовали реализовать это с помощью PowerShell Языками программирования не владею, в основном пользуюсь CMD/BAT и изредка готовыми скриптами VBS. Заранее благодарю за помощь.
0
|
|
| 26.01.2018, 14:09 | |
|
Ответы с готовыми решениями:
37
Найти строку, содержащую минимальный элемент матрицы. Найденную строку поменять местами с 4-ой строкой Последовательно выводить строку за строкой из определенной таблицы |
|
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 111
|
||
| 27.01.2018, 11:50 [ТС] | ||
|
В варианте с параллельной обработкой что-то не так, файл out.txt создает, но замену не производит! Добавлено через 5 минут Стоп, всё работает! Вариант с параллельной обработкой 10 000 ссылок за 40 секунд!
0
|
||
|
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
|
||||
| 27.01.2018, 12:17 | ||||
![]() Вы на пару с temphard, об одних и тех же файлах пишете? ![]()
Теперь и эти 40 секунд можете попробовать ускорить, меняя значения для $JobCount, $TextBlockSize. Только не так радикально ![]() Например: $JobCount = 6 (количество физических ядер в вашем ПК), $TextBlockSize = 10000 $JobCount = 6, $TextBlockSize = 100000 $JobCount = 12, $TextBlockSize = 10000 и т.п.
0
|
||||
|
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 111
|
|||
| 27.01.2018, 12:37 [ТС] | |||
![]()
0
|
|||
|
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
|
||
| 27.01.2018, 12:46 | ||
И параллельный, сами замены производит также, только сразу в $JobCount кусках текста.
0
|
||
|
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 111
|
||
| 27.01.2018, 13:13 [ТС] | ||
![]() $JobCount = 6, $TextBlockSize = 50000 (создается 7 процессов powershеll.exe, один основной с памятью 750 МБ, на остальные по 250-300 МБ ) - 100 000 ссылок, прошло 20 минут, результата не дождался... такое впечатление, что выгоднее разбить файл 2.тхт по 10 000 ссылок и обрабатывать их поочерёдно (10 000 - 40 секунд, значит 100 000 - 400 секунд - 6,6 минут, но на самом деле прошло больше 20 минут а процесс не закончен. Прервал, не стал дожидаться окончания. Добавлено через 17 минут $JobCount = 8, $TextBlockSize = 10000 (создается 9 процессов powershеll.exe, один основной с памятью 750 МБ, на остальные по 200-220 МБ ) - 100 000 ссылок, результат по моим подсчётам примерно 50 минут!!!!
0
|
||
|
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
|
||
| 27.01.2018, 13:27 | ||
Значит $TextBlockSize увеличивать не стоит... Попробуйте 6 x 10000 Помню, когда я делал выборку из IIS-журналов за месяц (~8 000 000 строк), то с начала решение в лоб работало минуты, а потом с помощью job'ов и подбора параметров типа $JobCount, $TextBlockSize время обработки сократилось до ~30 секунд.
0
|
||
|
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 111
|
||
| 27.01.2018, 13:49 [ТС] | ||
|
0
|
||
|
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
|
|
| 27.01.2018, 14:04 | |
|
0
|
|
| 27.01.2018, 14:08 | ||
|
Не по теме:
0
|
||
|
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
|
||
| 27.01.2018, 14:21 | ||
|
Или не тратьте больше своё время, и как советуют greg zakharov и volodin661, переходите с PS-скрипта на SQL-обработку.
0
|
||
|
|
|||||||||||||||||
| 29.01.2018, 00:10 | |||||||||||||||||
|
Для коллекции дополню, пожалуй, самым быстрым (из представленных) вариантом на PoSh + C#: ~10 сек на весьма не быстром компьютере.
Не могу, увы, сравнить с другими кодами - я просто не дождался окончания их работы на винрарном 4x ядерном CPU :-) Итак: Файлы для обработки: 1 млн. строк каждый c уникальными ссылками в каждой строке. Расход памяти: 250 mb (столько уходит на словарь c миллионом ключей вида "полная_ссылка"="короткая_ссылка";ес ли первый файл содержит не так много ключей - словарь будет куда компактнее)). Системные требования: powershell >=3.0, .NET >= 4.0 N.B. В Начальном ТЗ не было указано присутствуют ли в файле № 2 не только длинные ссылки. Я исходил из того, что там есть только полные ссылки, которые все нужно заменять на короткие (отсюда и очень простая регулярка). Для смешанного варианта - когда в файле № 2 есть ссылки и того, и другого вида - замена регулярными выражениями плохо подходит, если точно не знать вариации символьных сочетаний в ссылках. Поэтому данный вариант на смешанном файле правильно работать не будет.
P.S.
1
|
|||||||||||||||||
|
1887 / 1109 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
|
||||||||
| 29.01.2018, 18:18 | ||||||||
|
Я здесь выше писал, что хотел использовать хэштаблицы, но поленился Ваш пример на С# отлично иллюстрирует эффективность такого подхода.Добавлю пример с хэштаблицей на чистом PowerShell, очевидно, что C# он не перегонит, но точно работает быстрее моих предыдущих примеров (1M строчек на i5, обрабатывает за ~1 минуту):
0
|
||||||||
|
Покинул форум
3701 / 1484 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
|
|
| 29.01.2018, 18:45 | |
|
Garry Galler, еще большей производительности можно добиться через динамический метод, переписав C# код на IL, в итоге отыгрывается еще порядка трех секунд и уменьшается требование к памяти на ~50-55Mb. Минус, правда, будет во внешнем коде: получится портянка из опкодов. Еще один минус - железо. На двухядерных ЦП показатель все же снижается на порядок. В любом случае на месте автора темы было бы разумным взять на вооружение Ваш метод.
0
|
|
|
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 111
|
||||||||||||||||||||||||||
| 30.12.2019, 00:37 [ТС] | ||||||||||||||||||||||||||
|
Длительное время я использую этот метод и он меня вполне устраивает, но есть одна проблемка:
То есть если в файле 1.txt будет так:
Ну и замена третьей строки никуда не годиться. Такой вопрос, как подправить данный код, чтоб он производил замену в точности учитывая количество и регистр символов? То есть на выходе результат должен быть следующим:
0
|
||||||||||||||||||||||||||
|
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,027
|
|
| 30.12.2019, 01:11 | |
Сообщение было отмечено marianoredondo как решение
Решение
оператор -replace заменить на -creplace
1
|
|
|
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 111
|
|||||||||||||||||
| 30.12.2019, 01:24 [ТС] | |||||||||||||||||
|
Например вот эти две строки:
В итоге получается:
0
|
|||||||||||||||||
|
7094 / 2325 / 353
Регистрация: 10.12.2013
Сообщений: 8,027
|
|||||||||||
| 30.12.2019, 04:18 | |||||||||||
|
лень разбираться.
навскидку заменить в первой строке
1
|
|||||||||||
|
0 / 0 / 0
Регистрация: 13.11.2014
Сообщений: 111
|
|
| 31.12.2019, 00:41 [ТС] | |
|
Решил пойти другим путем. Просто в дальнейшем буду избегать одинаковых строк textstroka1 textstroka11.
Использую цифры от 1 до 9 а дальше буквы алфавита: Кликните здесь для просмотра всего текста
textstroka1
textstroka2 textstroka3 textstroka4 textstroka5 textstroka6 textstroka7 textstroka8 textstroka9 textstrokaА и т.д. В итоге код с задачей справляется. Всем спасибо за помощь и участие.
0
|
|
| 31.12.2019, 00:41 | |
|
Нужно заменить строку в файле text.txt словами из другого файла words.txt В двухмерном массиве первую строку поменять местами с последней строкой, вторую строку с предпоследней строкой и так далее.
Замена слова в одном файле строкой из другого файла Несколько txt файлов: в каждом нужно заменить определенную строку другой строкой Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла:
Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
|
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет
Новости компьютерного мира и их обсуждение (4)
Салют, шампанское, овации!
:drink:
|
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр.
Дословно, отклонённая. . .
|
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы
Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
|
|
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
|
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2.
Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
|
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
|
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
|