Страницы: 1
RSS
Переименовать файлы в папке
 
Добрый день, в папке есть файлы имеющие названия такого типа "Станция Имя 09.2022 (ФРС-2)"
нужно чтоб код удалял в имени файла вот этот момент "09.2022" (месяц и год во всех файлах разные). Имеется такая заготовка, пробовал сделать через python re.compile(r'\d\d.\d\d\d\d'), но что-то тоже не получилось.


Идея сделать это скриптом, к примеру формата .vbs, если есть возможность сделать это через VBA - можно им. Т.е чтоб человек мог зайти, в папке нажать на скрипт и чтоб все файлы переименовывались у него

import os, time
folder = "C:\\Users\\Dima\\Desktop\\pgp"
search_for = "месяц.год"
replace_to = ""
time.sleep(2)

with os.scandir(path=folder) as it:
for entry in it:
if entry.is_file():
print(entry.name)
new_name = entry.name.\
replace(
search_for,
replace_to)
print(new_name)
os.system("ren ""
+ folder + entry.name +
"" "" + new_name +
""")

В коде не могу додумать именно момент чтоб находило данную часть и удаляло ее "09.2022", т.е если в search_for вставить 2022, а в replace_to 2023 то все файлы в папке поменяют год на 2023.

" Станция Имя Имядва 05.2022 (ФМП-4)"
Вид во всех файлах такой, другого не будет
Т.е дата только одна, скобки в скобках быть не могут
Изменено: Diatr - 01.11.2022 06:31:51
 
Почитайте ТУТ у Дмитрия Щербакова
 
Индексы символов ведь одинаковые получаются, если концовка у названия одна и та же.
Вам нужно удалить символы строки с индексами от -15 до -9 включительно.
Шаблон для regexp можно использовать примерно такой:
(.*)(\d\d\.\d{4} )(.*) - получаем три группы, в новом имени используем первую и третью.
 
Создать пустую книгу.
Поместить код в модуль эта книга.
Сохранить, закрыть.
Открыть в папке, в которой нужно переименовать файлы.
Код
Option Explicit

Dim fso As Object

Private Sub Workbook_Open()
    RenameInCurrentFolder
    Application.Quit
End Sub

Sub RenameInCurrentFolder()
    Set fso = CreateObject("Scripting.FileSystemObject")
    FolderJob ThisWorkbook.Path
End Sub

Private Sub FolderJob(sFolder As String)
    Dim oFolder As Object
    On Error Resume Next
    Set oFolder = fso.GetFolder(sFolder)
    On Error GoTo 0
    If Not oFolder Is Nothing Then
        Dim oFile As Object
        For Each oFile In oFolder.Files
            FileJob CStr(oFile)
        Next
        
        Dim oSubFolder As Object
        For Each oSubFolder In oFolder.SubFolders
            FolderJob oSubFolder.Path
        Next
    End If
End Sub

Private Sub FileJob(sFile As String)
    Dim newFull As String
    Dim sName As String
    sName = fso.GetFileName(sFile)
    If Left(sName, 2) = "~$" Then Exit Sub
    
    If sName Like "*##.####*" Then
        Dim ii As Long
        Do
            ii = InStr(ii + 1, sName, ".")
            If ii = 0 Then Exit Do
            If ii > 2 Then
                If Mid(sName, ii - 2, 7) Like "##.####" Then
                    newFull = fso.GetParentFolderName(sFile) & Application.PathSeparator & Mid(sName, 1, ii - 3) & Mid(sName, ii + 5)
                    On Error Resume Next
                    Kill newFull
                    Name sFile As newFull
                    If fso.FileExists(newFull) Then Kill sFile
                    On Error GoTo 0
                End If
            End If
        Loop
    End If
End Sub

 
МатросНаЗебре, здравствуй, может я что-то делаю не так?

создал новый excel файл, alt + f11, insert/module - зашел, вставил данный код, книгу закрыл сохранив в формате  excel с макросами, но когда открываю данный файл переименования не происходят
 
Msi2102, спасибо, почитаю
 
Цитата
Diatr написал:
insert/module - зашел, вставил данный код
а вам пишут
Цитата
МатросНаЗебре написал:
Поместить код в модуль эта книга.
разницу улавливаете?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Здравствуйте. Гляньте, может подойдет, готовое решение.
 
Ігор Гончаренко, Спасибо, невнимательность
 
Ігор Гончаренко, МатросНаЗебре, Сейчас в данном коде вместо данных значений ставится двойной пробел, т.е из имени "Станция Имя 02.2022 (ФРС-2)" получается "Станция Имя  (ФРС-2)"  не подскажите где внести изменения чтоб оставался только один пробел вместо удаленной даты? Момент важный, т.к настроено много связей на данные файлы
Изменено: Diatr - 01.11.2022 12:24:59
 
Код
'v2
Dim fso As Object
 
Private Sub Workbook_Open()
    RenameInCurrentFolder
    Application.Quit
End Sub
 
Sub RenameInCurrentFolder()
    Set fso = CreateObject("Scripting.FileSystemObject")
    FolderJob ThisWorkbook.Path
End Sub
 
Private Sub FolderJob(sFolder As String)
    Dim oFolder As Object
    On Error Resume Next
    Set oFolder = fso.GetFolder(sFolder)
    On Error GoTo 0
    If Not oFolder Is Nothing Then
        Dim oFile As Object
        For Each oFile In oFolder.Files
            FileJob CStr(oFile)
        Next
         
        Dim oSubFolder As Object
        For Each oSubFolder In oFolder.SubFolders
            FolderJob oSubFolder.Path
        Next
    End If
End Sub
 
Private Sub FileJob(sFile As String)
    Dim newFull As String
    Dim sName As String
    sName = fso.GetFileName(sFile)
    If Left(sName, 2) = "~$" Then Exit Sub
     
    If sName Like "*##.####*" Then
        Dim ii As Long
        Dim ss As String
        Do
            ii = InStr(ii + 1, sName, ".")
            If ii = 0 Then Exit Do
            If ii > 2 Then
                If Mid(sName, ii - 2, 7) Like "##.####" Then
                    If Right(Mid(sName, 1, ii - 3), 1) = " " And Left(Mid(sName, ii + 5), 1) = " " Then
                        ss = Mid(sName, 1, ii - 3) & Mid(sName, ii + 6)
                    Else
                        ss = Mid(sName, 1, ii - 3) & Mid(sName, ii + 5)
                    End If
                    newFull = fso.GetParentFolderName(sFile) & Application.PathSeparator & ss
                    On Error Resume Next
                    Kill newFull
                    Name sFile As newFull
                    If fso.FileExists(newFull) Then Kill sFile
                    On Error GoTo 0
                End If
            End If
        Loop
    End If
End Sub
Цитата
написал:
Сейчас в данном коде вместо данных значений ставится двойной пробел
Неправильно. Вместо данных значений ставилась пустая строка. А двойной пробел получался, потому что пробелы в строке уже были.
Изменено: МатросНаЗебре - 01.11.2022 12:43:49
 
МатросНаЗебре, огромное спасибо!
Страницы: 1
Наверх