Переименование файлов по списку (таблице) соответствий
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2  Next  :| |:
Total Commander -> Автоматизация Total Commander

#1: Переименование файлов по списку (таблице) соответствий Author: myscience PostPosted: Tue Mar 22, 2016 14:06
    —
Есть огромная таблица соответствия (1,5 млн строк) - старое имя файла и новое имя файла.
Но файлов в папке на порядки меньше, чем в таблице с именами.
Батник выполняется очень долго, т.к. перебирает подряд все файлы.
Можно ли сделать скрипт, который сначала из таблицы извлечет встречающиеся файлы, а потом их переименует?
Очень хочется ускорить и рационализировать процесс

#2:  Author: ВахмуркаLocation: Большая деревня Москва PostPosted: Tue Mar 22, 2016 14:14
    —
1) Тотал при чем?
2) Каков формат списка? Если он текстовый, например
Code:
старое_имя1.txt новое_имя1.tx1
старое_имя2.txt новое_имя2.tx1
то средствами текстового редактора в начале каждой строчки поставить ren и запустить как батник. Неверные команды просто будут проигнорированы.
Не забудь сохранить исходный список и потренироваться на кошках! (а то некоторые забывают)

#3:  Author: myscience PostPosted: Tue Mar 22, 2016 14:30
    —
Батник есть, но он очень долго перебирает 1,5 млн строк.

#4:  Author: ВахмуркаLocation: Большая деревня Москва PostPosted: Tue Mar 22, 2016 14:40
    —
Ну, есть способ для эстетов-извращенцев.
1) Выделить все файлы в Тотале, сформировать список новых имен и нажать кнопку редактирования:
2) В тот же файл вставить имеющийся список;
3) Выделить в обоих списках повторяющиеся (то есть корректные) строки;
4) Из них сформировать искомый батник.
Тут все зависит от возможностей текстового редактора - может ли он выполнить пп. 3-4? Присмотрись к EmEditor'у - с помощью регулярных выражений он еще и не на такое способен...

#5:  Author: myscience PostPosted: Tue Mar 22, 2016 14:46
    —
Хотелось бы автоматически, каким-нибудь скриптом. Важно найти наиболее рациональный по времени выполнения задания путь, т.к. процедуру необходимо повторять много раз.

Дело в том, что одни и те же файлы разбросаны по сотням подпапок. В каждой запускать батник - это на неделю)))
А сваливать все в одну кучу - не хочется терять структуру каталогов.

#6:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 22, 2016 15:21
    —
myscience
Повторяю уже задававшийся вопрос: при чём тут Total Commander?
Под "групповым переименованием" без пояснений на данном подфоруме однозначно понимается инструмент группового переименования TC. Но к нему задача не относится по исходному условию с разным количеством файлов.
Скрипты и батники обсуждаются не в "Общих вопросах", а в подфоруме по автоматизации. Но и там предполагается всё же некая связь запрашиваемых действий с TC.

#7:  Author: myscience PostPosted: Tue Mar 22, 2016 15:30
    —
Мне заранее не было известно, что это к ТС не относится по исходному условию с разным количеством файлов.
Думал, что можно что-нибудь привинтить, чтоб получилось.
Можно ли перенести тему?

#8:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 22, 2016 15:46
    —
myscience
Можно. Переношу. Заголовок несколько изменил.

#9:  Author: myscience PostPosted: Tue Mar 22, 2016 15:59
    —
Avada, спасибо.

Ускорит ли IF-оператор выполнение батника?
Какой командой можно быстро отсеять лишние строки?

#10:  Author: ВахмуркаLocation: Большая деревня Москва PostPosted: Tue Mar 22, 2016 16:36
    —
2myscience
Жди Tol!k'а. Он заместитель Всевышнего по батникам

#11:  Author: FlasherLocation: Москва PostPosted: Tue Mar 22, 2016 22:58
    —
myscience
1) Формат файла таблицы какой?
2) Юникод в именах есть или всё обыкновенно?
3) Имена файлов базовые или полные? Без путей?
4) Файлы в корне активной папки или во всей её структуре?
5) Если с присваеваемым именем файл уже существует, добавлять к имени счётчик или пропускать?
_________________________________________________
Ладно, ТпС убёг. Покажу, как думаю. Может, кому пригодится.
Code:
'••••••••••••••••••••••••••••••••• VBS •••••••••••••••••••••••••••••••••
' Переименовать файлы активной панели по текстовому списку соответствий,
' где между старым и новым именем стоит один запрещённый в именах символ
'
' Условия:   путь запуска пользоват. команды/кнопки должен быть пустым;
'            список соответствий должен быть сохранён в кодировке UTF-8
'
' Параметры: "<Путь к файлу-списку>" <обработка структуры (нет/да): 0/1>
'•••••••••••••••••••••••••••••••••••••••••••••••••• Автор: Flasher © •••

Option Explicit : Dim A, Key, FSO, Con, RcS, _
WSS, FL, DB, Delim, Val, Var, Exs, Ext, T, C, i
Const Title = " Переименование файлов по базе соответствий      "
Set A = WSH.Arguments : If A.Count < 2 Then _
MsgBox Space(15) & "Укажите 2 параметра!", 48, Title : WSH.Quit
Key = "HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Text\Format"
Set FSO = CreateObject("Scripting.FileSystemObject")
Set RcS = CreateObject("ADODB.Recordset")
Set WSS = CreateObject("WScript.Shell")
DB = WSS.ExpandEnvironmentStrings(A(0))
If Not FSO.FileExists(DB) Then MsgBox "Файл-список отсутствует" &_
" по заданному пути:" & vbCr & A(0), 4144, Title : WScript.Quit
FL = FSO.OpenTextFile(DB).ReadLine
With New Regexp
  .Pattern = "[""/*\\\t:|<>?]"
  If .Test(FL) Then
    Delim = .Execute(FL).Item(0).Value : If Delim = vbTab Then _
    Delim = "TabDelimited" Else Delim = "Delimited(" & Delim & ")"
  Else  MsgBox "На первой строке списка отсутствует" &_
  " запрещённый символ!", 4144, Title: WSH.Quit: End If
End With : Val = WSS.RegRead(Key)
If Val <> Delim Then T = 1 : WSS.RegWrite Key, Delim, "REG_SZ"
Exs = FSO.GetParentFolderName(Key) & "\DisabledExtensions"
Ext = FSO.GetExtensionName(DB) : Var = WSS.RegRead(Exs)
If InStrRev(Var & ",", Ext & ",") = 0 Then _
C = 1 : WSS.RegWrite Exs, Var & "," & Ext, "REG_SZ"
RcS.Open "SELECT * FROM " & FSO.GetFileName(DB), "Provider=Microsoft.Jet." &_
"OLEDB.4.0;Data Source='" & FSO.GetParentFolderName(DB) &_
"';Extended Properties='text;CharacterSet=65001;HDR=No'"
FFolder FSO.GetFolder(FSO.GetAbsolutePathName(""))
RcS.Close : If i <> "" Then _
WSS.Popup Space(17) & "Файлы переименованы!", 2, Title, 4160 Else _
WSS.Popup "         Файлы не соответствуют списку!", 2, Title, 4144
If T Then WSS.RegWrite Key, Val, "REG_SZ"
If C Then WSS.RegWrite Exs, Var, "REG_SZ"

Sub FFolder(Folder)
  Dim F, N, BN, P
  For Each F in Folder.Files
    RcS.Filter = "[" & RcS.Fields(0).Name & "] = '" & F.Name & "'"
    If Not RcS.BOF Then
      N = Trim(RcS.Fields(1).Value)
      If N <> "" Then
        BN = FSO.GetBaseName(N) : Ext = FSO.GetExtensionName(N)
        i = 0 : P = Folder & "\" : If Ext <> "" Then Ext = "." & Ext
        While FSO.FileExists(P & N) Or FSO.FolderExists(P & N)
          i = i + 1 : N = BN & " (" & i & ")" & Ext
        Wend : F.Name = N
      End If
    End If
  Next : If A(1) = 1 Then _
  For Each F in Folder.SubFolders : FFolder F : Next
End Sub

#12:  Author: myscience PostPosted: Thu Sep 29, 2016 18:51
    —
Извините, пропал инет, не мог ответить. Sad

1) Формат файла таблицы какой?
csv, UTF-8
2) Юникод в именах есть или всё обыкновенно?
В целевых есть, UTF-8
3) Имена файлов базовые или полные? Без путей?
Без путей, в первой колонке текущее имя (файлы имеют имена без расширения), во второй - целевое имя, с расширением.
4) Файлы в корне активной папки или во всей её структуре?
Нужно рекурсивно
5) Если с присваиваемым именем файл уже существует, добавлять к имени счётчик или пропускать?
Добавлять счетчик, напр _2

#13:  Author: FlasherLocation: Москва PostPosted: Fri Sep 30, 2016 18:37
    —
Ушёл в моря. Пропал инет на 100 лет. Понятно..

Для UTF-8 без LogParser.dll, увы, не обойтись. Всё остальное было учтено.

#14:  Author: myscience PostPosted: Fri Sep 30, 2016 18:47
    —
Что это значит? Где почитать про LogParser.dll?
А если я сменю кодировку файла, пересохранив текстовым редактором, работать будет?

#15:  Author: FlasherLocation: Москва PostPosted: Fri Sep 30, 2016 18:56
    —
То и значит. Стандартным ADO это не решить. У LogQuery.CSVInputFormat есть возможность задать нужную кодовую страницу.
Пересохранение не получится при наличии юникодных символов.
Я, в принципе, могу переписать на LogParser с манифестом, но позже.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2  Next  :| |:
Page 1 of 2

Powered by phpBB © 2001, 2005 phpBB Group