View previous topic :: View next topic |
Author |
Message |
myscience
Joined: 22 Mar 2016 Posts: 21
|
(Separately) Posted: Tue Mar 22, 2016 14:06 Post subject: Переименование файлов по списку (таблице) соответствий |
|
|
Есть огромная таблица соответствия (1,5 млн строк) - старое имя файла и новое имя файла.
Но файлов в папке на порядки меньше, чем в таблице с именами.
Батник выполняется очень долго, т.к. перебирает подряд все файлы.
Можно ли сделать скрипт, который сначала из таблицы извлечет встречающиеся файлы, а потом их переименует?
Очень хочется ускорить и рационализировать процесс |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2585 Location: Большая деревня Москва
|
(Separately) Posted: Tue Mar 22, 2016 14:14 Post subject: |
|
|
1) Тотал при чем?
2) Каков формат списка? Если он текстовый, например Code: | старое_имя1.txt новое_имя1.tx1
старое_имя2.txt новое_имя2.tx1 | то средствами текстового редактора в начале каждой строчки поставить ren и запустить как батник. Неверные команды просто будут проигнорированы.
Не забудь сохранить исходный список и потренироваться на кошках! (а то некоторые забывают) _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
myscience
Joined: 22 Mar 2016 Posts: 21
|
(Separately) Posted: Tue Mar 22, 2016 14:30 Post subject: |
|
|
Батник есть, но он очень долго перебирает 1,5 млн строк. |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2585 Location: Большая деревня Москва
|
(Separately) Posted: Tue Mar 22, 2016 14:40 Post subject: |
|
|
Ну, есть способ для эстетов-извращенцев.
1) Выделить все файлы в Тотале, сформировать список новых имен и нажать кнопку редактирования:
2) В тот же файл вставить имеющийся список;
3) Выделить в обоих списках повторяющиеся (то есть корректные) строки;
4) Из них сформировать искомый батник.
Тут все зависит от возможностей текстового редактора - может ли он выполнить пп. 3-4? Присмотрись к EmEditor'у - с помощью регулярных выражений он еще и не на такое способен... _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
|
myscience
Joined: 22 Mar 2016 Posts: 21
|
(Separately) Posted: Tue Mar 22, 2016 14:46 Post subject: |
|
|
Хотелось бы автоматически, каким-нибудь скриптом. Важно найти наиболее рациональный по времени выполнения задания путь, т.к. процедуру необходимо повторять много раз.
Дело в том, что одни и те же файлы разбросаны по сотням подпапок. В каждой запускать батник - это на неделю)))
А сваливать все в одну кучу - не хочется терять структуру каталогов. |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10315 Location: Россия, Саратов
|
(Separately) Posted: Tue Mar 22, 2016 15:21 Post subject: |
|
|
myscience
Повторяю уже задававшийся вопрос: при чём тут Total Commander?
Под "групповым переименованием" без пояснений на данном подфоруме однозначно понимается инструмент группового переименования TC. Но к нему задача не относится по исходному условию с разным количеством файлов.
Скрипты и батники обсуждаются не в "Общих вопросах", а в подфоруме по автоматизации. Но и там предполагается всё же некая связь запрашиваемых действий с TC. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
myscience
Joined: 22 Mar 2016 Posts: 21
|
(Separately) Posted: Tue Mar 22, 2016 15:30 Post subject: |
|
|
Мне заранее не было известно, что это к ТС не относится по исходному условию с разным количеством файлов.
Думал, что можно что-нибудь привинтить, чтоб получилось.
Можно ли перенести тему? |
|
Back to top |
|
|
Avada
Joined: 01 Aug 2008 Posts: 10315 Location: Россия, Саратов
|
(Separately) Posted: Tue Mar 22, 2016 15:46 Post subject: |
|
|
myscience
Можно. Переношу. Заголовок несколько изменил. _________________ Даже самая богатая фантазия
Не представит себе наши безобразия. |
|
Back to top |
|
|
myscience
Joined: 22 Mar 2016 Posts: 21
|
(Separately) Posted: Tue Mar 22, 2016 15:59 Post subject: |
|
|
Avada, спасибо.
Ускорит ли IF-оператор выполнение батника?
Какой командой можно быстро отсеять лишние строки? |
|
Back to top |
|
|
Вахмурка
Joined: 27 Dec 2004 Posts: 2585 Location: Большая деревня Москва
|
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Mar 22, 2016 22:58 Post subject: |
|
|
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 |
_________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
myscience
Joined: 22 Mar 2016 Posts: 21
|
(Separately) Posted: Thu Sep 29, 2016 18:51 Post subject: |
|
|
Извините, пропал инет, не мог ответить.
1) Формат файла таблицы какой?
csv, UTF-8
2) Юникод в именах есть или всё обыкновенно?
В целевых есть, UTF-8
3) Имена файлов базовые или полные? Без путей?
Без путей, в первой колонке текущее имя (файлы имеют имена без расширения), во второй - целевое имя, с расширением.
4) Файлы в корне активной папки или во всей её структуре?
Нужно рекурсивно
5) Если с присваиваемым именем файл уже существует, добавлять к имени счётчик или пропускать?
Добавлять счетчик, напр _2 |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Sep 30, 2016 18:37 Post subject: |
|
|
Ушёл в моря. Пропал инет на 100 лет. Понятно..
Для UTF-8 без LogParser.dll, увы, не обойтись. Всё остальное было учтено. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
myscience
Joined: 22 Mar 2016 Posts: 21
|
(Separately) Posted: Fri Sep 30, 2016 18:47 Post subject: |
|
|
Что это значит? Где почитать про LogParser.dll?
А если я сменю кодировку файла, пересохранив текстовым редактором, работать будет? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Sep 30, 2016 18:56 Post subject: |
|
|
То и значит. Стандартным ADO это не решить. У LogQuery.CSVInputFormat есть возможность задать нужную кодовую страницу.
Пересохранение не получится при наличии юникодных символов.
Я, в принципе, могу переписать на LogParser с манифестом, но позже. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|