Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Заменить ссылки в txt файле, найдя одинаковые номера

Ответить
Настройки темы
Любой язык - [решено] Заменить ссылки в txt файле, найдя одинаковые номера

Ветеран


Сообщения: 558
Благодарности: 5

Профиль | Отправить PM | Цитировать


Здравствуйте, подскажите как сделать такое на powershell или bath ?

есть несколько txt файлов.. в каждом txt ссылки одного из нескольких типов..

пример одного из типов:

Код: Выделить весь код
https://google.com/file/6c616b50641a8/0001start.mp4
https://google.com/file/f0bafe33ee86d/0002start.mp4
https://google.com/file/82c4d96027879/0003start.mp4
https://google.com/file/2ca5c2ed414b6/0004start.mp4
https://google.com/file/8e616f8c54ce8/0005start.mp4
https://google.com/file/484651ad8773a/0006start.mp4
https://google.com/file/a0abb050c39f5/0007start.mp4
https://google.com/file/e93fb78dbcfcf/0008start.mp4
https://google.com/file/613bf9cc27632/0009start.mp4
https://google.com/file/e95ba702a2557/0010start.mp4
https://google.com/file/c7f25a80f361d/0011start.mp4
https://google.com/file/deletelink/0012start.mp4
https://google.com/file/bd95035d50f7a/0013start.mp4
https://google.com/file/deletelink/0014start.mp4
https://google.com/file/c5b0e8bc53652/0015start.mp4
https://google.com/file/deletelink/0016start.mp4
https://google.com/file/2ca4038062eb9/0017start.mp4
https://google.com/file/deletelink/0018start.mp4
https://google.com/file/976582ec7e383/0019start.mp4
https://google.com/file/20ab0d8a2856c/0020start.mp4
https://google.com/file/deletelink/0021start.mp4
https://google.com/file/df3b1c7694b27/0022start.mp4
https://google.com/file/deletelink/0023start.mp4
https://google.com/file/deletelink/0024start.mp4
https://google.com/file/9ce184ff0b163/0025start.mp4
https://google.com/file/es5gscfcf/0008start.mp4
https://google.com/file/c5bfgju3652/0015start.mp4
https://google.com/file/dwtgink/0021start.mp4
бывают txt с другими типами.. отличие в основном в имени файла, расширения разные, есть txt где в имени файла присутствует знак земли _ (примеры типов имен файлов.. 0024start.mp4, start0024.mp4, 0024start_m.jpg, start0024_m.jpg (буква после земли может быть другая).
Но как я говорил в одном txt файлы только какого - нибудь одного типа, необходимо либо несколько скриптов под разные типы файлов, либо один универсальный (если это возможно).
Теперь к тому, что должен делать скрипт

в каждом txt файле список ссылок, в конце которых есть имя файла... в составе имени файла обязательно есть номер, состоящий из 4ех цифр... номер этих цифр идет по порядку, начиная с 0001 (0001 - первая ссылка, 0002 - вторая ссылка, 0003 третья ссылка и т.д.). В какой то момент порядок нарушается, и идут ссылки, которые должны заменить тех, что выше (находить тех, которых заменить нужно по номеру), ссылка должна замениться полностью.

Другими словами нужно выполнить замену ссылок со старых на новые.. старые выше, новые ниже, определять по 4ех значному номеру в имени файла. За место старых ссылок должны встать новые, а новые со своих мест (снизу) удалиться. Дубликатов в новых ссылках не будет, номера у них будут разные.. такие же номера 100% будут в старых ссылках. txt файлы должны заменится на новые после применения скрипта. Из примера выше, после применения скрипта, txt файл должен стать таким..


Код: Выделить весь код
https://google.com/file/6c616b50641a8/0001start.mp4
https://google.com/file/f0bafe33ee86d/0002start.mp4
https://google.com/file/82c4d96027879/0003start.mp4
https://google.com/file/2ca5c2ed414b6/0004start.mp4
https://google.com/file/8e616f8c54ce8/0005start.mp4
https://google.com/file/484651ad8773a/0006start.mp4
https://google.com/file/a0abb050c39f5/0007start.mp4
https://google.com/file/es5gscfcf/0008start.mp4
https://google.com/file/613bf9cc27632/0009start.mp4
https://google.com/file/e95ba702a2557/0010start.mp4
https://google.com/file/c7f25a80f361d/0011start.mp4
https://google.com/file/deletelink/0012start.mp4
https://google.com/file/bd95035d50f7a/0013start.mp4
https://google.com/file/deletelink/0014start.mp4
https://google.com/file/c5bfgju3652/0015start.mp4
https://google.com/file/deletelink/0016start.mp4
https://google.com/file/2ca4038062eb9/0017start.mp4
https://google.com/file/deletelink/0018start.mp4
https://google.com/file/976582ec7e383/0019start.mp4
https://google.com/file/20ab0d8a2856c/0020start.mp4
https://google.com/file/dwtgink/0021start.mp4
https://google.com/file/df3b1c7694b27/0022start.mp4
https://google.com/file/deletelink/0023start.mp4
https://google.com/file/deletelink/0024start.mp4
https://google.com/file/9ce184ff0b163/0025start.mp4
т.е. осталось 25 ссылок, идущих по порядку по номеру, остальные 3, которые были ниже, заменили собой тех, которые были выше, найдя их по номеру

Отправлено: 15:17, 14-12-2023

 

Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt я231218.vbs.txt
(1.4 Kb, 9 просмотров)

Alexander_88, чтобы быстро и с сортировкой по возрастанию - vbs
Код: Выделить весь код
Option Explicit

Dim BoxIn, AllFol
AllFol = Array("Z:\Box_In", _
            "Z:\Soft_In")

Dim FSO, App, Fol, Itm, File, S, SS, Reg, num, i, Max
Set FSO = CreateObject("Scripting.FileSystemObject")
Set App = CreateObject("Shell.Application")
Set Reg = CreateObject("VBScript.RegExp"): Reg.Global = True

For Each BoxIn In AllFol
    Set Fol = App.Namespace(BoxIn)
    Set Itm = Fol.Items()
    Itm.Filter 64 + 128, "*.txt"

    ReDim AllOut(9999)
    For Each File In Itm
        File = BoxIn + "\" + File.Name
        With FSO.OpenTextFile(File, 1, False)
            Max = 0
            Do While Not .AtEndOfStream
                SS = .ReadLine
                If SS <> Empty Then
                    S = Split(SS, "/")
				i = UBound(S)
                    num = FSO.GetBaseName(S(i))
                    If Reg.Test(num) Then
                        Reg.Pattern = "\D"
                        num = CLng(Reg.Replace(num, ""))
                        If num <= 9999 Then
                            If Max < num Then Max = num
                            AllOut(num) = SS
                        End If
                    End If
                End If
            Loop
            .Close
        End With
        
        With FSO.OpenTextFile(File, 2, True)
            For i = 1 To Max
                If AllOut(i) <> Empty Then .WriteLine (AllOut(i))
            Next
            .Close
        End With
    Next
Next
В прикрепленном файле уберите расширение .txt и пропишите пути к своим папкам

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:40, 18-12-2023 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 558
Благодарности: 5

Профиль | Отправить PM | Цитировать


а куда выходит результирующий файл? или он заменяется?

Код: Выделить весь код
Option Explicit

Dim BoxIn, AllFol
AllFol = Array("C:\Work\CONTENT")
Dim FSO, App, Fol, Itm, File, S, SS, Reg, num, i, Max
Set FSO = CreateObject("Scripting.FileSystemObject")
Set App = CreateObject("Shell.Application")
Set Reg = CreateObject("VBScript.RegExp"): Reg.Global = True

For Each BoxIn In AllFol
    Set Fol = App.Namespace(BoxIn)
    Set Itm = Fol.Items()
    Itm.Filter 64 + 128, "fileslink.txt"

    ReDim AllOut(9999)
    For Each File In Itm
        File = BoxIn + "\" + File.Name
        With FSO.OpenTextFile(File, 1, False)
            Max = 0
            Do While Not .AtEndOfStream
                SS = .ReadLine
                If SS <> Empty Then
                    S = Split(SS, "/")
				i = UBound(S)
                    num = FSO.GetBaseName(S(i))
                    If Reg.Test(num) Then
                        Reg.Pattern = "\D"
                        num = CLng(Reg.Replace(num, ""))
                        If num <= 9999 Then
                            If Max < num Then Max = num
                            AllOut(num) = SS
                        End If
                    End If
                End If
            Loop
            .Close
        End With
        
        With FSO.OpenTextFile(File, 2, True)
            For i = 1 To Max
                If AllOut(i) <> Empty Then .WriteLine (AllOut(i))
            Next
            .Close
        End With
    Next
Next
что то ничего не происходит, наверное пути не правильно поставил.

Отправлено: 21:47, 19-12-2023 | #12


Ветеран


Contributor


Сообщения: 2735
Благодарности: 1699

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip Work20.zip
(2.9 Kb, 8 просмотров)

Цитата Alexander_88:
есть несколько txt файлов »
Вы жестко забили в фильтре 1 файл fileslink.txt по 1 пути "C:\Work\CONTENT"
Такой файл имеется? Тут архив тестового комплекта. На нём работает.
Вот вариант скрипта с проверкой существования файла(ов)
Код: Выделить весь код
Option Explicit

Dim BoxIn, AllFol
AllFol = Array("C:\Work\CONTENT")                   '("Z:\Box_In", "Z:\Soft_In")
Const Mask = "fileslink.txt"                        '"*.txt"

Dim FSO, App, Fol, Itm, File, S, SS, Reg, num, i, Max
Set FSO = CreateObject("Scripting.FileSystemObject")
Set App = CreateObject("Shell.Application")
Set Reg = CreateObject("VBScript.RegExp"): Reg.Global = True

For Each BoxIn In AllFol
    Set Fol = App.Namespace(BoxIn)
    Set Itm = Fol.Items()
    Itm.Filter 64 + 128, Mask
    If Itm.Count <> 0 Then
        ReDim AllOut(9999)
        For Each File In Itm
            File = BoxIn + "\" + File.Name
            With FSO.OpenTextFile(File, 1, False)
                Max = 0
                Do While Not .AtEndOfStream
                    SS = .ReadLine
                    If SS <> Empty Then
                        S = Split(SS, "/")
                        i = UBound(S)
                        num = FSO.GetBaseName(S(i))
                        If Reg.Test(num) Then
                            Reg.Pattern = "\D"
                            num = CLng(Reg.Replace(num, ""))
                            If num <= 9999 Then
                                If Max < num Then Max = num
                                AllOut(num) = SS
                            End If
                        End If
                    End If
                Loop
                .Close
            End With
        
            With FSO.OpenTextFile(File, 2, True)
                For i = 1 To Max
                    If AllOut(i) <> Empty Then .WriteLine (AllOut(i))
                Next
                .Close
            End With
        Next
    Else
        MsgBox "File(s)" + vbCr + BoxIn + "\" + Mask + vbCr + "not found", 16, "Not found"
    End If
Next

Результирующий файл заменяется.
Иное делается "на раз".

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:24, 20-12-2023 | #13


Ветеран


Сообщения: 558
Благодарности: 5

Профиль | Отправить PM | Цитировать


megaloman, спасибо, все получилось, заменяет 800 ссылок очень быстро

Отправлено: 07:59, 21-12-2023 | #14



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Заменить ссылки в txt файле, найдя одинаковые номера

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - [решено] Посчитать одинаковые значения в txt ivan.vas Скриптовые языки администрирования Windows 4 05-10-2021 16:53
CMD/BAT - [решено] Выборка и txt по списку в txt файле cyberp1983 Скриптовые языки администрирования Windows 5 24-05-2018 20:27
Любой язык - [решено] Заменить ссылки в одном тхт файле, взяв их из другого Alexander_88 Скриптовые языки администрирования Windows 2 14-02-2016 09:25
Любой язык - [решено] заменить ссылки из одного тхт на ссылки в другом тхт Alexander_88 Скриптовые языки администрирования Windows 4 11-10-2015 16:46
CMD/BAT - [решено] Заменить фамилию в .txt файле Помогите! doorsman Скриптовые языки администрирования Windows 8 28-03-2012 00:14




 
Переход