读取目录中的文件列表并使用批处理命令文件复制内容

时间:2016-05-30 05:38:44

标签: windows file csv batch-file text

我在目录中有一个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"。

请帮忙。

1 个答案:

答案 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的工作方式如下:

  • 打开指定的oputput文件,然后
  • 将某些内容写入oputput文件,最后
  • 关闭 oputput文件。

如果在较大文件的下一个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!"  
    )