我需要帮助创建一个批处理脚本,该脚本将文件名添加到所有子文件夹中每个.csv的第一行。批处理文件将位于主文件夹中。同一文件夹将包含多个子文件夹,每个子文件夹包含大量.csv文件。我需要将文件保留在各自的文件夹中。我的目标是将其添加到另一个工作脚本中,该脚本将子文件夹中的所有文件合并为一个.csv。这将提供一种浏览合并文件的方法。我发现了一些类似的帖子,但它们并不是我想要的。这是我能找到的最接近的东西,但是分隔符会让我失去Batch file to Write Filename to first line
File Structure Example: C:\MainFolder\batch_script.bat C:\MainFolder\SubFolder1\csv1.csv C:\MainFolder\SubFolder1\csv2.csv C:\MainFolder\SubFolder2\csv3.csv C:\MainFolder\SubFolder2\csv4.csv
运行脚本之前的文件内容
csv1.csv: This is the content of csv1.csv csv2.csv: This is the content of csv2.csv csv3.csv: This is the content of csv3.csv csv4.csv: This is the content of csv4.csv
运行脚本后的文件内容:
csv1.csv: csv1.csv This is the content of csv1.csv csv2.csv: csv2.csv This is the content of csv2.csv csv3.csv: csv3.csv This is the content of csv3.csv csv4.csv: csv4.csv This is the content of csv4.csv
P.S。 我也在另一个网站上发现了这个代码,但我不确定如何让它循环遍历不同的子文件夹
FOR /F "usebackq tokens=1" %%i IN (`DIR /B`) DO (
ECHO %%i >> %1
TYPE %%i >> %1
)
答案 0 :(得分:0)
试试这个:
for /r %%a in (*.csv) do (
copy /y "%%~a" "%temp%\%%~na"
Echo %%~na > "%%~a"
for /f "usebackq" %%b in ("%temp%\%%~na") do Echo %%b >> "%%~a"
del "%temp%\%%~na"
)
这应该做你想要的。如果可以的话,我会先测试一下。
答案 1 :(得分:0)
@echo off
setlocal enableextensions disabledelayedexpansion
for /r %%a in (*.csv) do (
set /p "firstLine=" < "%%~fa"
setlocal enabledelayedexpansion
for /f "delims=" %%b in (".!firstLine!") do endlocal & if not "%%~b"==".%%~nxa" (
( echo %%~nxa
type "%%~fa"
) > "%%~fa.new"
move /y "%%~fa.new" "%%~fa" >nul
)
)
它的作用是生成一个名为csv作为第一行的新文件,将csv附加到新文件并将新文件移到csv上。在此过程中,它会测试第一行的内容是否与csv的名称相同,以避免在每次运行批处理文件时重新包含文件名。
已编辑以适应评论 - 由于该过程不会针对csv文件集运行多次,因此完整代码可以缩减为
@echo off
setlocal enableextensions disabledelayedexpansion
for /r %%a in (*.csv) do (
( echo %%~nxa
type "%%~fa"
) > "%%~fa.new"
move /y "%%~fa.new" "%%~fa" >nul
)
答案 2 :(得分:0)
这应该在all.csv
下的树中的每个文件夹中创建C:\MainFolder
,并在每个filename
文件的内容之前添加CSV
。
文件名将包含完整路径,但如果需要,可以轻松更改。
@echo off
for /d /r "C:\MainFolder\" %%a in (*) do (
pushd "%%a"
(for %%b in (*.csv) do (
echo %%b
type "%%b"
)
)>all.tmp
ren all.tmp all.csv
popd
)
pause