Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименование части имен файлов (http://forum.oszone.net/showthread.php?t=306515)

use809 11-10-2015 13:50 2562703

Переименование части имен файлов
 
Здравствуйте.
Имеется куча файлов с латинскими названиями. Например: "brotogerys panychlorus, strix passerina, jynx torquilla.txt" и тому подобные.
Также есть csv файл с переводом, т.е. "strix passerina=Little Owl", "brotogerys panychlorus=Yellow-billed Thrush" (две колонки: первая - латинские, вторая - английские) и т.п.

Вообщем нужно все латинские названия в именах файлов переименовать в английские. Желательной батником. Своих познаний не хватило. Нужна помощь. Можно составить батник только для первых указанных выше названий, дальше я пойму принцип и составлю все что нужно в пакетном режиме. Заранее спасибо.

Foreigner 11-10-2015 14:08 2562707

use809, А разделитель в csv какой? Допустим ';'
Код:

@echo off
setlocal

for /f "tokens=1,2 delims=;" %%i in (data.csv) do ren "%%i.txt" "%%j.txt"


use809 11-10-2015 14:31 2562714

Разделитель ;
У меня файлы вида "brotogerys panychlorus, strix passerina, jynx torquilla.txt", т.е. в названии одного файла несколько (2-3) латинских словосочетаний. В csv файле эти же названия, но по-одному, одиночные, т.е. "brotogerys panychlorus;Yellow-billed Thrush", "strix passerina;Little Owl". Вот эти одиночные и нужно найти в названиях файлов и заменить на английские.
Предложенный Вами вариант ищет только одиночные названия (ren "strix passerina.txt" в "Little Owl.txt"). По одиночным у меня батник свой есть. Нужен именно, чтобы переименовывал часть имени файлов.

use809 11-10-2015 17:16 2562750

Видимо, нужно что-то вроде этого алгоритма:
1. прочитать имя первого файла
2. внести его имя в строковую переменную
3. заменить в переменной все найденные из csv-файла значения из первой колонки на значения из 2-й колонки
4. переименовать файл на полученное значение переменной.
5. перейти к следующему файлу

Georgio 12-10-2015 02:07 2562839

Код:

@echo off
setlocal enabledelayedexpansion

set "csv=example.csv"

for /f "delims=" %%i in ('2^>nul dir/a-d/b') do (
 set "x=%%~ni"
 for %%j in ("!x:, =" "!") do <"%csv%" (
  for /f "tokens=2 delims=;" %%k in ('find/i %%j') do (
  if defined y (set "y=!y!, %%k") else (set "y=%%k")
  )
 )|| set "y=!x!"
 ren "%%i" "!y!%%~xi"& set "y="
)

endlocal
exit/b


use809 12-10-2015 07:28 2562856

Помогло! Большое спасибо!

use809 12-10-2015 08:33 2562866

Видимо, нужна небольшая доработка.
Вот часть csv-файла:

dysithamnus_leucostictus;White-spotted Antvireo
dysithamnus_leucostictus_leucostictus;White-streaked Antvireo (White-streaked)
dysithamnus_leucostictus_tucuyensis;White-streaked Antvireo (Venezuelan)

Вот файл: "dysithamnus_leucostictus.txt"
Запускаю bat-файл, после переименования получается:
"White-spotted Antvireo, White-streaked Antvireo (White-streaked), White-streaked Antvireo (Venezuelan).txt"

А должно быть только "White-spotted Antvireo.txt".
Где-то нужно поставить кавычки в скрипте или что-то типа этого?

Хотя думаю, решу этот вопро сам (дополнительнзнак введу (!) в конце каждого лат. названия в ориг. именах)

Georgio 12-10-2015 09:33 2562878

Цитата:

Цитата use809
Где-то нужно поставить кавычки в скрипте или что-то типа этого? »



Практически угадали. Нужно добавить кавычки, тильду и точку с запятой:


Код:

@echo off
setlocal enabledelayedexpansion

set "csv=example.csv"

for /f "delims=" %%i in ('2^>nul dir/a-d/b') do (
 set "x=%%~ni"
 for %%j in ("!x:, =" "!") do <"%csv%" (
  for /f "tokens=2 delims=;" %%k in ('find/i "%%~j;") do (
  if defined y (set "y=!y!, %%k") else (set "y=%%k")
  )
 )|| set "y=!x!"
 ren "%%i" "!y!%%~xi"& set "y="
)

endlocal
exit/b


.




Но, как выяснил, это тоже не панацея, так как в случае одновременного наличия в CSV-файле строк типа "dysithamnus_leucostictus;White-spotted Antvireo" и "bla-bla-bla_dysithamnus_leucostictus;White-streaked Antvireo (White-streaked)" файл "dysithamnus_leucostictus.txt" также будет переименован некорректно.



Выход нашёл в использовании команды "FINDSTR" вместо команды "FIND":


Код:

@echo off
setlocal enabledelayedexpansion

set "csv=example.csv"

for /f "delims=" %%i in ('2^>nul dir/a-d/b') do (
 set "x=%%~ni"
 for %%j in ("!x:, =" "!") do <"%csv%" (
  for /f "tokens=2 delims=;" %%k in ('more^| findstr/bilc:"%%~j;"') do (
  if defined y (set "y=!y!, %%k") else (set "y=%%k")
  )
 )|| set "y=!x!"
 ren "%%i" "!y!%%~xi"& set "y="
)

endlocal
exit/b


,

use809 12-10-2015 12:00 2562926

Вложений: 1
Объясню на примере, что получается.
Если файл имеет название "ptilinopus_porphyraceus, ptilinopus_pelewensis.txt", то переводит замечательно "Crimson-crowned Fruit-Dove, Palau Fruit-Dove.txt"

Некоторых латинских названий нет в csv файле, т.е. их переводить не нужно, а оставить латинскими, т.к. в csv их не нашлось.

Если имя "ptilinopus_rarotogensis, ptilinopus_fasciatus, ptilinopus_porphyraceus, ptilinopus_chrysogaster, ptilinopus_pelewensis" (1, 2 и 4-го нет в csv-файле, нет перевода), то оставляет таким же и в конце добавляет ", Palau Fruit-Dove.txt", т.е.
"ptilinopus_rarotogensis, ptilinopus_fasciatus, ptilinopus_porphyraceus, ptilinopus_chrysogaster, ptilinopus_pelewensis, Palau Fruit-DoveFruit-Dove".
Хотя нужно, чтобы было:
"ptilinopus_rarotogensis, ptilinopus_fasciatus, Crimson-crowned Fruit-Dove, ptilinopus_chrysogaster, Palau Fruit-Dove"
Пока не разобрался, что поправить.
Во вложении txt-файл с латинскими названиями, data.csv и батник.

Georgio 12-10-2015 13:48 2562979

Код:

@echo off
setlocal enabledelayedexpansion

set "csv=data.csv"

for /f "delims=" %%i in ('2^>nul dir/a-d/b') do (
 set "x=%%~ni"
 for %%j in ("!x:, =" "!") do <"%csv%" (
  for /f "tokens=2 delims=;" %%k in ('more^| findstr/bilc:"%%~j;"') do (
  if defined y (set "y=!y!, %%k") else (set "y=%%k")
  )
 )|| if defined y (set "y=!y!, %%~j") else (set "y=%%~j")
 ren "%%i" "!y!%%~xi"& set "y="
)

endlocal
exit/b


use809 12-10-2015 14:15 2562990

Благодарю! Сам бы я точно не додумался. Все работает как надо.


Время: 20:33.

Время: 20:33.
© OSzone.net 2001-