|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Переименование имени файла fb2 в соответствии с тэгами |
|
Переименование имени файла fb2 в соответствии с тэгами
|
Старожил Сообщения: 282 |
Профиль | Отправить PM | Цитировать Имеются множество книжек с не пронумированными сериями - ни в имени файла, ни в секции sequence.
Вручную нумировать - долго, файлов много. Пока идея пришла такая, чтоб книги шли в порядке их выхода, считывать первые 30 строк книги, из нужных тэгов брать информацию и формировать имя файла: Фамилия Имя - Серия 2010-02-03 - Название.fb2 <first-name>Имя</first-name> <last-name>Фамилия</last-name> <sequence name="Серия" /> <book-title>Название</book-title> <date value="2010-02-03">03 February 2010</date> Несколько дней читаю форумы, справки, но пока даже не понимаю, как подступиться к решению вопроса. |
|
Отправлено: 10:35, 07-11-2019 |
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата DenchikK:
Можно прикрепить пример файла такой книги? |
|
Отправлено: 13:22, 07-11-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 282
|
Профиль | Отправить PM | Цитировать Цитата Creat0R:
Скрытый текст
Цитата:
Отсмотрел несколько книг - обычно последняя из искомых строк располагается не ниже 28 строки (если нет тэга <middle-name> и проч). Я взял 30 строк с подстраховкой, но может я и не прав. |
||
Последний раз редактировалось DenchikK, 07-11-2019 в 15:38. Отправлено: 15:26, 07-11-2019 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Отправлено: 17:20, 07-11-2019 | #4 |
Старожил Сообщения: 282
|
Профиль | Отправить PM | Цитировать Цитата Iska:
Я тупо в лоб пробовал - рассматривая файл, как текстовый с разметкой, зачищая не нужный мусор. В лоб не получилось и с xml - немного поискав, я так и не понял, как под мои нужды подставить то, что я нашёл. Но я на одном форуме нашёл вариант с использованием функции _StringBetween. Всё вроде здорово, всё как я и хотел, и получилось проще, чем я пытался до этого. Я не могу пока придумать, как проще из этого: <date value="2010-02-03">03 February 2010</date> вычленить это: 2010-02-03 Пока в голову приходят безумные способы. Цитата Iska:
Разные серии - разные дирректории. Теперь бы понять, как дату вычленить, чтоб назначить переменной. |
|||
Последний раз редактировалось DenchikK, 08-11-2019 в 07:18. Отправлено: 21:20, 07-11-2019 | #5 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Вариант для переименования одного файла, прикрутить пакетную обработку, думаю, несложно будет
Скрытый текст
Local Const $APP_NAME = "fb2renamer" Local Const $APP_VERSION = "0.1" Local Const $APP_TITLE = $APP_NAME & " v" & $APP_VERSION Local $g_oXML Main() Func _ReadXMLNodeText($oXMLobj, $sNode) Local $result = $oXMLobj.SelectSingleNode($sNode) If IsObj($result) Then Return $result.text Else Return "" EndIf EndFunc ;==>_ReadXMLNodeText Func _ReadXMLNodeAttrib($oXMLobj, $sNode, $sAttrib) Local $sXPath = $sNode & "[@" & $sAttrib & "]" Local $result = $oXMLobj.SelectSingleNode($sXPath) If IsObj($result) Then Return $result.getAttribute($sAttrib) Else Return "" EndIf EndFunc ;==>_ReadXMLNodeAttrib Func _GetParentDir($sFileName) Return StringLeft($sFileName, StringInStr($sFileName, "\", 0, -1) - 1) EndFunc ;==>_GetParentDir Func _GetFileName($sFileName) Return StringTrimLeft($sFileName, StringInStr($sFileName, "\", 0, -1)) EndFunc ;==>_GetFileName Func _GetNewName($sFile) If $g_oXML.load($sFile) Then Local $result Local $sLastName, $sMiddleName, $sFirstName, $sBookTitle, $sSequenseName, $sSequenseNumber, $sDate Local $oNode = $g_oXML.SelectSingleNode("//FictionBook/description/title-info") $sLastName = _ReadXMLNodeText($oNode, "author/last-name") $sMiddleName = _ReadXMLNodeText($oNode, "author/middde-name") $sFirstName = _ReadXMLNodeText($oNode, "author/first-name") $sBookTitle = _ReadXMLNodeText($oNode, "book-title") $sSequenseName = _ReadXMLNodeAttrib($oNode, "sequence", "name") $sSequenseNumber = _ReadXMLNodeAttrib($oNode, "sequence", "number") $sDate = _ReadXMLNodeAttrib($oNode, "date", "value") If $sDate == "" Then $oNode = $g_oXML.SelectSingleNode("//FictionBook/description/document-info") $sDate = _ReadXMLNodeAttrib($oNode, "date", "value") EndIf ; Новое имя файла: Local $sNewFileName = "" _ & $sLastName & " " _ & $sFirstName & " " _ & $sMiddleName & " - " _ & $sSequenseName & " " _ & ($sSequenseNumber <> "" ? "(" & $sSequenseNumber & ")" : "") & " " _ & $sDate & " - " _ & $sBookTitle _ & ".fb2" $sNewFileName = StringRegExpReplace($sNewFileName, "\ +", " ") $sNewFileName = StringReplace($sNewFileName, " - - ", " - ") Return $sNewFileName Else SetError(1) ; 1 == file not found Return "" EndIf EndFunc ;==>_GetNewName Func _DisplayHelp() MsgBox(0, $APP_TITLE, "" _ & @ScriptName & " [ -y ] FILE1 FILE2 ... FILE(n)" & @CRLF _ & @CRLF _ & @TAB & "-y" & @TAB & "Переименовать файлы вместо тестирования" & @CRLF _ ) Exit 0 EndFunc ;==>_DisplayHelp Func _PickUpNewName($sFileName) Local $sNewName = $sFileName Local $iCount = 1 While True If FileExists($sNewName) Then $sNewName = StringRegExpReplace($sNewName, " \([0-9]+\).fb2", " \(" & $iCount & "\).fb2") If @extended = 0 Then $sNewName = StringReplace($sNewName, ".fb2", " (" & $iCount & ").fb2") Else ExitLoop EndIf $iCount += 1 WEnd Return $sNewName EndFunc ;==>_PickUpNewName Func _RenameSingleFile($bTestMode, $sFileName) Local $sOldFullName = FileGetLongName($sFileName, 1) Local $sOldFileName = _GetFileName($sOldFullName) Local $sFolderName = _GetParentDir($sOldFullName) Local $sNewFileName = _GetNewName($sOldFullName) Local $sNewFullName = _PickUpNewName($sFolderName & "\" & $sNewFileName) $sNewFileName = _GetFileName($sNewFullName) If $bTestMode Then Local $iBtn = MsgBox(4, $APP_TITLE, "" _ & "Папка: " & @CRLF _ & $sFolderName & @CRLF & @CRLF _ & "Имя книги:" & @CRLF _ & $sOldFileName & @CRLF & @CRLF _ & "Новое имя: " & @CRLF _ & $sNewFileName & @CRLF & @CRLF _ & @CRLF _ & "Переименовать?" _ ) If $iBtn = 6 Then FileMove($sOldFullName, $sNewFullName) Else FileMove($sOldFullName, $sNewFullName) EndIf EndFunc ;==>_RenameSingleFile Func _QuitWithMessage($sMessage, $iMsgBoxCode = 0, $iExitCode = 0) MsgBox($iMsgBoxCode, $APP_TITLE, $sMessage) Exit $iExitCode EndFunc ;==>_QuitWithMessage Func Main() $g_oXML = ObjCreate("Microsoft.XMLDOM") If Not IsObj($g_oXML) Then _QuitWithMessage("Ошибка инициализации XML :(", 16, 1) Local $bOptTestMode = True If $CmdLine[0] = 0 Then _DisplayHelp() For $i = 1 To $CmdLine[0] Select Case $CmdLine[$i] = "/?" _DisplayHelp() Case $CmdLine[$i] = "-y" $bOptTestMode = False Case FileExists($CmdLine[$i]) _RenameSingleFile($bOptTestMode, $CmdLine[$i]) EndSelect Next EndFunc ;==>Main |
Отправлено: 21:31, 07-11-2019 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата DenchikK:
|
|
Отправлено: 22:21, 07-11-2019 | #7 |
Старожил Сообщения: 168
|
Профиль | Отправить PM | Цитировать Какое, однако, странное решение... Хотя бы потому, что AutoIt не сможет забраться в zip-архив.
Для подобного лучше подойдёт Total Commander или Double Commander: инструмент группового переименования и один из плагинов для получения инфи из файлов FB2 (eBookInfo WDX, Fast Fb2 wdx или поновее Fast Fb2 Epub от того же автора). |
------- Отправлено: 11:23, 17-04-2020 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать oz84, ну, автор хотел скрипт — он его получил.
|
Отправлено: 11:53, 17-04-2020 | #9 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать К этому, однако, странному решению поддержку zip-архивов прикрутить - минутное дело, соответствующий UDF существует давно.
|
Отправлено: 12:34, 17-04-2020 | #10 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Переименование файла по шаблону и перенос нового имени в буфер обмена. | Vjjjik | Скриптовые языки администрирования Windows | 1 | 03-02-2018 03:18 | |
Разное - Синтаксическая ошибка в имени файла, имени папки или метке тома | Maestro Deno | Microsoft Windows 7 | 8 | 05-03-2017 19:21 | |
Доступ - Синтаксическая ошибка в имени файла, имени папки или метке тома | Maestro Deno | Microsoft Windows 7 | 1 | 05-03-2017 16:18 | |
CMD/BAT - [решено] Переименование имени файла по маске | Дмитрий_Кульгейко@vk | Скриптовые языки администрирования Windows | 10 | 12-07-2016 20:15 | |
CMD/BAT - [решено] Переименование файла по данным из самого файла | dark-------13 | Скриптовые языки администрирования Windows | 11 | 21-04-2011 18:08 |
|