使用CSV值重命名文件

时间:2016-12-01 10:30:29

标签: csv batch-file

我的文件看起来像这样:

******************* Diagram Options****************
number_of_plots=4
header='Number of cycles'
color='red'
xlabel='RPM'
ylabel='degree'

我的CSV看起来像这样:

1989_Footer.gif
1989_Header.gif
260273_Footer.gif
260273_Header.gif
...

我想用CSV中给出的文件编号重命名文件编号。 CSV中的第一个数字是旧数字,第二个数字(分号后面)是新数字。如何在不加下划线后触摸文本的情况下实现这一目标?

我考虑过获取文件名,然后搜索CSV中的数字,并将其替换为分号后同一行中的值。

3 个答案:

答案 0 :(得分:2)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q40908252.txt"
FOR /f "usebackqtokens=1*delims=;" %%a IN ("%filename1%") DO (
 FOR /f "tokens=1*delims=_" %%r IN ('dir /b /a-d "%sourcedir%\%%a_*"') DO (
  ECHO(REN "%sourcedir%\%%r_%%s" "%%b_%%s"
 )
)

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

我使用了一个名为q40908252.txt的文件,其中包含我的测试数据。

为了测试目的,所需的REN命令仅为ECHO在您确认命令正确后,将ECHO(REN更改为REN以实际重命名文件。

使用;作为分隔符,读取csv文件,将{ - 1}}中的from-prefix和%%a中的to前缀放在一起。

执行名为" %% a_ 任何"的文件的目录列表在源目录中,%%b上的标记,以便第一个标记(必须为_)转到%%a,其余名称转到%%r,然后重命名带有前缀的文件已切换。

假设文件名中的第一个%%s永远不会是倍数 - _

答案 1 :(得分:1)

我的JREN.BAT regular expression renaming utility可以简化解决方案。 JREN.BAT是纯脚本(混合批处理/ JScript),可以在任何Windows机器上从XP开始本地运行 - 不需要第三方exe文件。可以从命令行通过jren /?jren /??获取完整文档以获取分页帮助。

从批处理脚本中:

@echo off
for /f "delims=; tokens=1,2" %%A in (rename.csv) do call jren "^%%A_" "%%B_" /fm *.gif

从命令行:

for /f "delims=; tokens=1,2" %A in (rename.csv) do @jren "^%A_" "%B_" /fm *.gif

答案 2 :(得分:0)

我可能会这样做(见解释性说明rem):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_CSV=%~dpn0.csv" & rem // (path to the CSV file holding the old and new numbers)
set "_LOC=%~dp0"      & rem // (path to the directory containing the files to rename)
set "_PAT=*.gif"      & rem // (pattern of the file name part after the first `_`)

rem // Walk through the CSV file line by line and read old and new numbers:
for /F "usebackq tokens=1-2 delims=,;" %%K in ("%_CSV%") do (
    rem // Search files whose names begin with the old number and an `_`:
    for /F "delims=" %%F in ('dir /B /A:-D "%_LOC%\%%K_%_PAT%"') do (
        rem // Store current file name into variable:
        set "NAME=%%F"
        rem // Toggle delayed expansion to not lose any `!` in the file name:
        setlocal EnableDelayedExpansion
        rem // Rename current file by replacing the old number by the new one:
        ECHO ren "%_LOC%\!NAME!" "%%L_!NAME:*_=!"
        endlocal
    )
)

endlocal
exit /B

成功测试脚本后删除大写的ECHO命令!

此方法的优点在于,即使第一个_之后的文件名部分也以_开头,它也能正常工作;因此,文件名1989__some_name.gif将重命名为10773387__some_name.gif,因此会保留两个连续的__