首页 > 解决方案 > 使用批处理脚本编辑多个文件夹中多个文本文件的每一行的第一个单词

问题描述

我在多个文件夹中有多个文本文件。在每个文本文件中,它都由这个组成;

0 0.211328 0.386111 0.088281 0.197222
3 0.283984 0.319444 0.067969 0.161111
2 0.387109 0.514583 0.102344 0.112500

我想将每行的第一个数字编辑为 0,如下所示;

0 0.211328 0.386111 0.088281 0.197222
0 0.283984 0.319444 0.067969 0.161111
0 0.387109 0.514583 0.102344 0.112500

到目前为止,在通过堆栈溢出搜索之后,我设法使用这个脚本成功地完成了代码;

@echo off
setlocal EnableDelayedExpansion
FOR /L %y IN (1,1,10000) DO IF EXISTS %y.txt (
    (for /F "tokens=1*" %a in (%y.txt) do (
        FOR /F %c IN ("!var:~0,1!") DO echo 0 %b 
        )
    )
) >%y_.txt

但是,这仅在我的 .txt 文件名是数字时才有效。我将范围设置为 10000,因为我正在处理 1 个文件夹中的数千个文本文件。并且,这段代码创建了一个名为 %y_.txt 的新文本文件,其中 %y 保存了访问文件的名称,我添加了 _ 以避免文件名混淆。

我可能需要新的文本文件来替换具有相同名称的旧文本文件,但使用 %y 作为新文件名不起作用。

等等,不仅如此。

我还可能需要编辑位于上一个文件夹中的所有其他 .txt 文件。树文件夹看起来很像这样;

   D:
    ├───Folder-A
    │   ├───folder-1
    │   │   ├──1.txt
    │   │   ├──2.txt
    │   │   └──3.txt
    │   └───folder-2
    │       ├──a.txt
    │       └──b.txt
    │
    └───Folder-B
        ├───folder-x
        │   ├──8.txt
        │   ├──9.txt
        │   └──10.txt
        └───folder-y
            ├──y.txt
            └──z.txt

前面的代码仅在我位于特定文件夹目录且不进入子文件夹时才有效。我尝试使用dir /b/s *.txt,但我不知道把它放在哪里。

我希望有人可以在这里帮助我。顺便说一句,这是我第一次使用批处理脚本,也是我作为研究生实习生的第一个任务。感谢您的帮助:D

标签: windowsbatch-filecommand-prompt

解决方案


这将递归地遍历子目录并找到所有.txt文件并将每行中的第一项替换为0

@echo off
for /f "delims=" %%a in ('dir /b /s /a-d *.txt') do (
    for /f "tokens=1*" %%i in ('type %%~a') do (
     (echo 0 %%j)>>"%%~dpna.tm"
  )
   if exist "%%~dpna.tm" move /Y "%%~dpna.tm" "%%~fa"
 )

运行前请注意!这将创建一个包含原始内容的临时文件,一旦进行了相关更改,它将将该文件重命名为原始文件(来自临时文件),因此请不要在您的 prod 环境中运行它,直到您对其进行测试虚拟dir目录的所有级别都需要有临时文本文件,否则这会将每个出现的第一个空格单词替换为0

您可能还想在脚本pushd "C:\somedir"之后@echo offpopd末尾添加,以确保它运行您希望它运行的目录。


推荐阅读