首页 > 解决方案 > 批处理窗口 - 用祖父文件夹名称递归替换所有 csv 的第一列

问题描述

我需要替换文件夹和子文件夹中包含的每个 csv 的第一列中的所有值,并将祖父文件夹的名称放在那里。我得到了这段代码,以在前面需要的步骤中获取祖父文件夹名,并将其放在文件名中。但是,如果我尝试将此信息放在一个变量中,这将清空并在该代码行中使用它是解决它的唯一方法。你能帮我修改我的代码以找到并用祖父母文件夹名称替换单词“XXX”吗?先感谢您

@Echo OFF
FOR /D /R %%# in (*) DO (
    PUSHD "%%#"
  FOR %%@ in ("*.csv") DO (
for %%I in (..) DO Ren "%%@" "%%~nI%%~xI_%%~n#_%date:/=%%%~x@"
    )
    POPD
)

Pause&Exit

EDIT1:CSV 结构 (|)

FIELD1|FIELD2|FIELD3|FIELD4|FIELD5|FIELD6|FIELD7|FIELD7|FIELD9|FIELD10|FIELD11|FIELD12|FIELD13|FIELD14|FIELD15
STRINGTOBEREPLACED|A|IT545454|M000000\ABCD|root/SERVER||SQL Service User|Enabled|05/05/2020|ADMIN(root\ADMINS)|ADMIN(root\ADMINS)
STRINGTOBEREPLACED|A|IT545454|M000000\ABCD|root/SERVER||SQL Service User|Enabled|05/05/2020|ADMIN(root\ADMINS)|ADMIN(root\ADMINS)
STRINGTOBEREPLACED|A|IT545454|M000000\ABCD|root/SERVER||SQL Service User|Enabled|05/05/2020|ADMIN(root\ADMINS)|ADMIN(root\ADMINS)

标签: windowsbatch-file

解决方案


警告。此脚本假定您在每个文件中都有标题。同样重要的是要了解csv文件不能包含!,因为这将不包括由于delayedexpansion使用而导致的那些字符。该脚本不会写回原始文件,而是写入临时文件,然后它将替换原始文件。所以我建议你创建一个包含一些csv文件的测试目录结构并在其中运行脚本,首先在任何实际数据文件上运行它。

请阅读脚本的每个部分,以准确了解它的作用。它通过脚本所在的目录(%~dp0)递归,因此您需要确保将其放置在路径的正确位置。

@echo off & setlocal enabledelayedexpansion
for /r %%a in (*.csv) do for /d %%i in (%%~dpa..) do (
    set header=
    set "repl=%%~nxi"
    for /f "usebackq delims=" %%x in ("%%~a") do if not defined header set "header=%%x"
    (echo !header!)>"%%~dpatemp.txt"
    for /f "usebackq skip=1 tokens=1* delims=|" %%c in ("%%~a") do (
       set "output=%%~nxi|%%d"
       (echo !output!)>>"%%~dpatemp.txt"
    )
   break>"%%~fa"
   move /Y "%%~dpatemp.txt" "%%~fa"
)

推荐阅读