С Новым годом! Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 17.02.2024
Сообщений: 1
1

Сравнение старого URL с новым, замена по совпадающему слову (значению) с выводом в новый файл

17.02.2024, 19:41. Показов 688. Ответов 5
Метки bat, cmd (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!

Задача почти 1 в 1 как вот эта (самое первое решение). Вариант рабочий, но только там сравнение происходит по данным после последнего /. В моем же случае одинаковые данные содержатся в середение URL.

Например, файл old.txt:
Код
TTH JS https://d.ru/rs/cr/D10151671/v14/ZT.xls
TTH JS https://d.ru/rs/cr/D10159999/v15/ZT.xls
Файл new.txt:
Код
https://d.ru/rs/cr/D10151671/v59/ten.xls
Необходимый мне файл result.txt:
Код
TTH JS https://d.ru/rs/cr/D10151671/v59/ten.xls
TTH JS https://d.ru/rs/cr/D10159999/v15/ZT.xls
Атрибуты и их количество перед https:// могут быть разные, но https:// есть всегда.
Одинаковые значения, как правило, всегда находятся перед предпоследним /.

К сожалению, знаний не хватает. Что можно изменить в первом решении для обработки согласно моему запросу?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.02.2024, 19:41
Ответы с готовыми решениями:

Замена старого SSD на новый
Добрый вечер, будьте добры помочь, хочу обновить текущий SSD 128 гб, на новый SSD от 200 гб. По...

Макрос на копирование в новый файл и сохранение с новым названием по первому абзацу
Всем доброго вечера, прошу вашей помощи! Изначально нужен был макрос на разделение файла word...

В поле RichEdit удалить html-теги; при вставке в RichEdit замена старого текста на новый
Всем привет! помогите пожалуйста с написание кода на две процедуры : - В поле RichEdit удалить...

Работа с указателями. Программа должна вывести новый видоизменный файл из старого
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <math.h> #include <locale.h>...

Открыть URL (там ссылка, которая совершает переход на другой URL) и вытянуть новый URL
Стоит задача по одному URL получить другой Пробовал открывать URL через webbrowser, но это не...

5
bat-пропагандист
974 / 176 / 75
Регистрация: 07.12.2022
Сообщений: 442
Записей в блоге: 12
17.02.2024, 23:28 2
вот решение, еле написал, вроде работает:
Windows Batch file
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
@echo off
setlocal EnableDelayedExpansion
pushd "%~dp0"
 
copy nul result.txt > nul
 
for /f "tokens=*" %%i in (old.txt) do (
    set "str=%%i"
    set "strp=!str:https=" "!"
    set counter=0
    for %%j in ("!strp!") do (
        if !counter!==0 set "attr=%%~j"
        if !counter!==1 (
            set "link=https%%~j"
            call :get_lss_parts "!link!" 2 plink
            set counter2=0
            for /f "tokens=*" %%k in (new.txt) do (
                call :get_lss_parts "%%k" 2 pk
                call :get_lst_parts "%%k" 2 pklstp
                if "!plink!"=="!pk!" (
                    echo.!attr!!plink!/!pklstp!>> result.txt
                ) else (
                    if !counter2!==0 ( echo.!attr!!link!>> result.txt )
                )
                set /a counter2+=1
            )
        )
        set /a counter+=1
    )
)
 
popd
 
exit /b
 
:str_len
    set _len=0
    set "__str=%~1"
    
    :_str_len_loop
        set "__str=%__str:~1%"
        set /a _len+=1
    if not "%__str%"=="" goto _str_len_loop
    
    set "%~2=%_len%"
goto :eof
 
:str_count
    set _count=0
    set "_str=%~1"
    call :str_len "%_str%" _len
    
    for /l %%i in (0,1,%_len%) do (
        echo.!_str! | findstr "^%~2" >nul 2>nul
        if !ERRORLEVEL!==0 set /a _count+=1
        set "_str=!_str:~1!"
    )
    set "%~3=%_count%"
goto :eof
 
:get_lss_parts
    setlocal
    set "str=%~1"
    call :str_count "%str%" / count
    set "strp=%str:/=" "%"
    set counter=0
    set /a countm2=count-%~2
    for %%i in ("!strp!") do (
        if !countm2! geq !counter! set "pstr=!pstr!/%%~i"
        set /a counter+=1
    )
    set "pstr=%pstr:~1%"
    endlocal & set "%~3=%pstr%"
goto :eof
 
:get_lst_parts
    setlocal
    set "str=%~1"
    call :str_count "%str%" / count
    set "strp=%str:/=" "%"
    set counter=0
    set /a countm2=count-%~2
    for %%i in ("!strp!") do (
        if !countm2! lss !counter! set "pstr=!pstr!/%%~i"
        set /a counter+=1
    )
    set "pstr=%pstr:~1%"
    endlocal & set "%~3=%pstr%"
goto :eof
0
2399 / 686 / 288
Регистрация: 26.03.2022
Сообщений: 1,287
Записей в блоге: 1
18.02.2024, 15:06 3
DyhG,
Цитата Сообщение от DyhG Посмотреть сообщение
Одинаковые значения, как правило, всегда находятся перед предпоследним /.
Два пишем, три в уме? Если одинаковые значения всегда находятся перед предпоследним, то есть на третьем с конца месте, то
Windows Batch file
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
@Echo Off &cls
>nul Chcp 1251
    Set "FileInOld=Z:\Box_In\Old.txt"
    Set "FileInNew=Z:\Box_In\New.txt"
    Set "FileOut=Z:\Box_Out\result.txt"
    Set /A M=3
 
    2>nul Del "%FileOut%"
    If Not Exist "%FileInOld%" (Echo "%FileInOld%" not found &Pause &Exit /B 2) 
    If Not Exist "%FileInNew%" (Echo "%FileInNew%" not found &Pause &Exit /B 2) 
 
    For /F "usebackq tokens=1* delims=:" %%f In (`2^>nul More "%FileInOld%"`) Do (
        Call :Pars "%%g" "/%%~nxg" "All" "Part"
        For /L %%i In (2,1,%M%) Do Call:Pars "%%All%%" "/%%Part%%" "All" "Part"
        Set "Out=%%f:%%g"
        For /F "usebackq Skip=2 tokens=2 delims=:" %%n In (`2^>nul Call Find /I "/%%Part%%/" "%FileInNew%"`) Do Set "Out=%%f:%%n"
        Call Echo %%Out%%>>"%FileOut%"
    )
Pause
Exit /B
 
:Pars
    Set "A=%~p1"
    Set "A=%A:~0,-1%"
    Set "A=//%A:/=\%"
    Set "%~3=%A%" &Set "%~4=%~nx1"
Exit /B
0
6302 / 2144 / 337
Регистрация: 10.12.2013
Сообщений: 7,387
18.02.2024, 18:39 4
Учитывая предоставленные данные,

вырисовывается следующий общий алгоритм:

Код
в каждой строке выделяется URL, который разбивается на секции по разделителю '/'.
Затем, разбитые по секциям URL-строки в файлах OLD и NEW сравниваются попарно
и находится пара с максимальным количеством совпадений. В ней и будут производиться желаемые замены.

1      2  3   4  5    6       7    8
https://d.ru/rs/cr/D10151671/v14/ZT.xls   |
                                          | => 6 совпадений из 8 секций
https://d.ru/rs/cr/D10151671/v59/ten.xls  |


https://d.ru/rs/cr/D10159999/v15/ZT.xls   |
                                          | => 5 совпадений из 8 секций
https://d.ru/rs/cr/D10151671/v59/ten.xls  |


http://e.ru/ss/rr/E10151671/n59/klop.xls  |
                                          | => 1 совпадение из 8 секций
https://d.ru/rs/cr/D10151671/v14/ZT.xls   |


в данном примере такой является первая пара и в этой паре
( https://d.ru/rs/cr/D10151671/v14/ZT.xls )
несовпадающая часть ( v14/ZT.xls ) меняется на новую ( v59/ten.xls)


Очевидно, что данный алгоритм не зависит от взаимного расположения сравниваемых секций.


осталось определить, какой инструмент позволит реализовать этот алгоритм самым простым и эффективным способом.
2
2399 / 686 / 288
Регистрация: 26.03.2022
Сообщений: 1,287
Записей в блоге: 1
18.02.2024, 21:53 5
Вопрос задан в разделе Batch (CMD/BAT) поэтому и выбран инструмент CMD. Предложенный .bat - файл решает задачу, он будет медленный, возможно на какой-то строке не отработает. CMD и строки - это скорее всего проблемы, зато стандартный для большинства используемых Wiindows. Не надо ничего доустанавливать, что особенно важно по требованиям безопасников. Вот еще решение стандартным средством: vbs-скрипт, стандартный для большинства используемых Wiindows.
Visual Basic
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
Const FileInOld = "Z:\Box_In\Old.txt"
Const FileInNew = "Z:\Box_In\New.txt"
Const FileOut = "Z:\Box_Out\Result.txt"
Const M = 3
 
Set Dic = CreateObject("Scripting.Dictionary")
 
With CreateObject("Scripting.FileSystemObject")
    With .OpenTextFile(FileInNew, 1)
        Do While Not .AtEndOfStream
            jLine = .ReadLine
            j = Split(jLine, "/"): U = UBound(j)
            If U > M Then
                If Not Dic.Exists(UCase(j(U - M + 1))) Then Dic.Add UCase(j(U - M + 1)), jLine
            End If
        Loop
        .Close
    End With
    
    Set F2 = .OpenTextFile(FileOut, 2, True)
    Set F1 = .OpenTextFile(FileInOld, 1)
    With .OpenTextFile(FileInOld, 1)
        Do While Not .AtEndOfStream
            jLine = .ReadLine
            j = Split(jLine, "/"): U = UBound(j)
            If U > M Then
                If Not Dic.Exists(UCase(j(U - M + 1))) Then
                    F2.WriteLine jLine
                Else
                    F2.WriteLine Split(jLine, ":")(0) + ":" + Split(Dic.Item(UCase(j(U - M + 1))), ":")(1)
                End If
            End If
        Loop
        .Close
    End With
    F2.Close
End With
Я сделал как мог, кто хочет - пусть делает иное. Но делает.
0
Заблокирован
19.02.2024, 12:17 6
Цитата Сообщение от Angry Old Man Посмотреть сообщение
Не надо ничего доустанавливать, что особенно важно по требованиям безопасников
вы ведь им не сказали, что установить можно сразу из батника, из воздуха прям? и даже drweb не спасёт
0
19.02.2024, 12:17
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2024, 12:17
Помогаю со студенческими работами здесь

Создать новый файл с новым текстом, переписать в начало и в конец данного файла текст из первого файла
Дан файл, содержащий текст. Создать новый файл с новым текстом, переписать в начало и в конец...

Поиск по ключевому слову с выводом результата в TextBox
Подскажите решение следующего вопроса. Имеется таблица в БД где имеется наименование Организаций...

Поиск по слову в файле с выводом всего содержимого в memo
Есть программа, которая вводит информацию о товарах, с трех разных эдитов и сохраняет эту...

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

Определенному слову (значению) - определенный цвет
Еще раз здравствуйте. Есть форма редактирования данных. В ней <select> <td...

Сгенерировать страницу с новым url javascript
Доброго времени суток! Есть проблема - делаю анонс в Одноклассники:...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution прилагаю файл архива проекта Gowin Eda и снимок. Восьмибитный счётчик из сумматора+ генератор сигнала согласования+ стартер fast регистров. Файлы прилагаю. . . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
Как создать нейросеть для генерации картинок на Python
InfoMaster 12.01.2025
Генерация изображений с помощью искусственных нейронных сетей стала одним из наиболее захватывающих направлений в области компьютерного зрения и машинного обучения. В этой статье мы рассмотрим. . .
Создание нейросети для генерации текста на Python
InfoMaster 12.01.2025
Нейросети, или искусственные нейронные сети, представляют собой модели машинного обучения, вдохновленные работой человеческого мозга. Они состоят из множества взаимосвязанных узлов, или "нейронов",. . .
Как создать нейросеть распознавания изображений на Python
InfoMaster 12.01.2025
Введение в распознавание изображений с помощью нейросетей Распознавание изображений с помощью нейронных сетей стало одним из самых впечатляющих достижений в области искусственного интеллекта. Эта. . .
Основы искуственного интеллекта
InfoMaster 12.01.2025
Искусственный интеллект (ИИ) представляет собой одну из наиболее динамично развивающихся областей современной науки и технологий. В широком смысле под искусственным интеллектом понимается способность. . .
Python и нейросети
InfoMaster 12.01.2025
Искусственные нейронные сети стали неотъемлемой частью современных технологий, революционизировав множество областей - от медицинской диагностики до автономных транспортных средств. Python, благодаря. . .
Python в машинном обучении
InfoMaster 12.01.2025
Python стал неотъемлемой частью современного машинного обучения, завоевав позицию ведущего языка программирования в этой области. Его популярность обусловлена несколькими ключевыми факторами, которые. . .
Создание UI на Python с TKinter
InfoMaster 12.01.2025
TKinter — это одна из наиболее популярных библиотек для создания графических интерфейсов пользователей (GUI) в языке программирования Python. TKinter входит в стандартную библиотеку Python, что. . .
HTML5 в разработке мобильных приложений
InfoMaster 12.01.2025
Введение: Обзор роли HTML5 в мобильной разработке В современном мире мобильных технологий HTML5 стал ключевым инструментом для разработки кроссплатформенных приложений. Эта технология произвела. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru