我在目录中有一个csv文件列表,其名称格式为XX_YYYFile.csv,其中XX是可以包含任何字符(包括空格)的名称,YYY是随机3位数。例如:" book_123File.csv"," best movie_234File.csv"等我想读取这个文件列表然后通过删除" _YYYFile&#34来创建新的CSV文件;。新文件的内容与原始文件的内容相同,但第一行需要添加值"数字,名称,日期"。
set inputFileFolder=C:\Input
set outputFileFolder=C:\Output
FOR /F "delims=" %%F IN ('DIR %inputFileFolder%\*File.csv /B /O:D') DO (
set reportInputFile=%inputFileFolder%\%%F
set reportInputFileName=%%F
set result=!reportInputFileName:~0,-12!
set reportOutputFileName=!result!.csv
set reportOutputFile=%outputFileFolder%\!result!.csv
echo number,name,date > !reportOutputFile!
for /f "tokens=* delims=" %%a in (!reportInputFile!) do (
echo %%a >> !reportOutputFile!
)
)
如果我运行此批处理文件,请提交" book.csv"使用正确的内容成功创建(第一行:"数字,名称,日期",下一行来自文件" book_123.csv")。但文件"最好的movie_234.csv"和其他文件包含文件名中的空格未成功创建。文件"最佳movie.csv"仅创建一行"数字,名称,日期"。文件的内容"最好的movie_234.csv"不会复制到文件"最佳movie.csv"。
请帮忙。
答案 0 :(得分:0)
您需要Escape Characters, Delimiters and Quotes正确。另请注意内部for /F
循环中的usebackq
parameter:
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
set "inputFileFolder=C:\Input"
set "outputFileFolder=C:\Output"
FOR /F "delims=" %%F IN ('DIR "%inputFileFolder%\*File.csv" /B /O:D') DO (
set "reportInputFile=%inputFileFolder%\%%F"
set "reportInputFileName=%%F"
set "result=!reportInputFileName:~0,-12!"
set "reportOutputFileName=!result!.csv"
set "reportOutputFile=%outputFileFolder%\!result!.csv"
>"!reportOutputFile!" echo number,name,date
for /f "usebackq tokens=* delims=" %%a in ("!reportInputFile!") do (
>>"!reportOutputFile!" echo %%a
)
rem above `for /f ... %%a ...` loop might be replaced by FINDSTR
rem >>"!reportOutputFile!" findstr "^" "!reportInputFile!"
rem or by TYPE
rem >>"!reportOutputFile!" type "!reportInputFile!"
)
提示:每个>
and >>
redirector的工作方式如下:
如果在较大文件的下一个for /f ... %%a ...
循环中重复此过程可能会非常慢:
>"!reportOutputFile!" echo number,name,date
for /f "usebackq tokens=* delims=" %%a in ("!reportInputFile!") do (
>>"!reportOutputFile!" echo %%a
)
使用块语法:
>"!reportOutputFile!" (
echo number,name,date
for /f "usebackq tokens=* delims=" %%a in ("!reportInputFile!") do (
echo %%a
)
)
上面的for /f ... %%a ...
循环可能被FINDSTR
command替换(消除空行,如for
),如下所示:
>"!reportOutputFile!" (
echo number,name,date
findstr "^." "!reportInputFile!"
)
或TYPE
command(保留空行不像for
),如下所示:
>"!reportOutputFile!" (
echo number,name,date
type "!reportInputFile!"
)