PDA

Показать полную графическую версию : [решено] Переименование части имен файлов


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

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

Foreigner
11-10-2015, 14:08
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
Разделитель ;
У меня файлы вида "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
Видимо, нужно что-то вроде этого алгоритма:
1. прочитать имя первого файла
2. внести его имя в строковую переменную
3. заменить в переменной все найденные из csv-файла значения из первой колонки на значения из 2-й колонки
4. переименовать файл на полученное значение переменной.
5. перейти к следующему файлу

Georgio
12-10-2015, 02:07
@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
Помогло! Большое спасибо!

use809
12-10-2015, 08:33
Видимо, нужна небольшая доработка.
Вот часть 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
Где-то нужно поставить кавычки в скрипте или что-то типа этого? »



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


@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
Объясню на примере, что получается.
Если файл имеет название "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
@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
Благодарю! Сам бы я точно не додумался. Все работает как надо.




© OSzone.net 2001-2012