【问题标题】:Reading list of files in a directory and copying the contents using batch command file读取目录中的文件列表并使用批处理命令文件复制内容
【发布时间】:2016-05-30 05:38:44
【问题描述】:

我在一个目录中有一个 csv 文件列表,其名称格式为 XX_YYYFile.csv,其中 XX 是一个可以包含任何字符(包括空格)的名称,而 YYY 是随机的 3 位数字。例如:“book_123File.csv”、“best movie_234File.csv”等。我想阅读此文件列表,然后通过删除“_YYYFile”创建新的 CSV 文件。新文件的内容与原文件相同,只是第一行需要添加值“number,name,date”。

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”)。但是文件“best movie_234.csv”和其他文件名中包含空格的文件没有成功创建。文件“best movie.csv”仅使用 1 行“编号、名称、日期”创建。文件“best movie_234.csv”的内容不会复制到文件“best movie.csv”。

请帮忙。

【问题讨论】:

    标签: windows file csv batch-file text


    【解决方案1】:

    您需要正确地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!"  
        )
    

    【讨论】:

    • 非常感谢!现在工作正常。我将改用 TYPE 命令,因为它更快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多