如何将多个CSV文件拆分为两个标题行-有行限制

如何将多个CSV文件拆分为两个标题行-有行限制,csv,batch-file,Csv,Batch File,我需要批量申请 主要目标:将.csv文件拆分为单独的文件。有行限制 源文件夹包含许多.CSV文件 每个主文件有2个标题行。并且分割的文件应具有相同的2个标题行 代码中必须有一个参数来设置分割文件中的行限制 源文件夹(包含1个或多个.csv文件)的代码中必须有一个参数 目标文件夹的代码中必须有一个参数(要包含拆分文件) 每个拆分文件的名称与源文件相同,源文件在所有拆分文件中添加了“编号”(例如:源文件ABC.CSV,共3行。行限制=2。traget文件:ABC_1_of_2.CSV,ABC 2_o

我需要批量申请

  • 主要目标:将.csv文件拆分为单独的文件。有行限制
  • 源文件夹包含许多.CSV文件
  • 每个主文件有2个标题行。并且分割的文件应具有相同的2个标题行
  • 代码中必须有一个参数来设置分割文件中的行限制
  • 源文件夹(包含1个或多个.csv文件)的代码中必须有一个参数
  • 目标文件夹的代码中必须有一个参数(要包含拆分文件)
  • 每个拆分文件的名称与源文件相同,源文件在所有拆分文件中添加了“编号”(例如:源文件ABC.CSV,共3行。行限制=2。traget文件:ABC_1_of_2.CSV,ABC 2_of_2.CSV)
  • 此代码适用于单个文件

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    rem // Define constants here:
    set _FILE="C:\Users\USER\Desktop\Split\MAINFILE.CSV"   & rem // (first command line argument is input file)
    set /A "_LIMIT=100" & rem // (number of records or rows per output file)
    
    rem // Split file name:
    set NAME=c:\users\USER\Desktop\Split\Splitted\MAINFILE & rem // (path and file name)
    set EXT=.csv    & rem // (file name extension)
    
    rem // Determine number of lines excluding header:
    for /F %%I in ('^< "%_FILE%" find /V /C ""') do set /A "COUNT=%%I-1"
    
    rem // Split file into multiple ones:
    setlocal EnableDelayedExpansion
    rem // Read file once:
    < "!_FILE!" (
        rem // Read header (first line):
        set /P HEADER1=""
        set /P HEADER2=""
        rem // Calculate number of output files:
        set /A "DIV=(COUNT-1)/_LIMIT+3"
        rem // Iterate over output files:
        for /L %%J in (1,1,!DIV!) do (
            rem // Write an output file:
            > "!NAME!_%%J_of_!DIV!!EXT!" (
                rem // Write header:
                echo/!HEADER1!
            echo/!HEADER2!
                rem // Write as many lines as specified:
                for /L %%I in (1,1,%_LIMIT%) do (
                    set "LINE=" & set /P LINE=""
                    if defined LINE echo/!LINE!
                )
            )
        )
    )
    endlocal
    
    endlocal
    exit /B
    
    
    @echo关闭
    setlocal EnableExtensions DisableDelayedExpansion
    rem//在此处定义常量:
    set\u FILE=“C:\Users\USER\Desktop\Split\MAINFILE.CSV”&rem/(第一个命令行参数是输入文件)
    设置/A“_LIMIT=100”&rem//(每个输出文件的记录或行数)
    rem//拆分文件名:
    set NAME=c:\users\USER\Desktop\Split\Splitted\MAINFILE&rem/(路径和文件名)
    set EXT=.csv&rem//(文件扩展名)
    rem//确定不包括标题的行数:
    对于/F%%I in(“^<“%\u文件%”查找/V/C”“”),请设置/A“计数=%%I-1”
    rem//将文件拆分为多个文件:
    setlocal EnableDelayedExpansion
    rem//读取文件一次:
    <“!\u文件!”(
    rem//读取标题(第一行):
    设置/P标题1=“”
    设置/P标题2=“”
    rem//计算输出文件的数量:
    设置/A“DIV=(计数-1)/_限制+3”
    rem//迭代输出文件:
    对于/L%%J in(1,1,!DIV!)do(
    rem//写入输出文件:
    >“!NAME!\uu%%J\u of!DIV!!分机!”(
    rem//写入头:
    回声/!头1!
    回声/!头2!
    rem//按指定的行数写入:
    对于/L%%I in(1,1,%\u限制%)do(
    设置“行=“&set/P行=“”
    如果定义了LINE echo/!LINE!
    )
    )
    )
    )
    端部
    端部
    退出/B
    
    但当我试图移动文件夹中的所有文件时,我被卡住了,代码不起作用

    setlocal EnableExtensions DisableDelayedExpansion
    Set /A "Location=C:\USER\"
    For /R "C:\USER\Source\" %%f in (*.csv) do (
    rem // Define constants here:
    set _FILE=%%f   & rem // (first command line argument is input file)
    set /A "_LIMIT=20" & rem // (number of records or rows per output file)
    rem // Split file name:
    set "NAME=C:\USER\Splitted\%%~nf" & rem // (path and file name)
    set EXT=.csv    & rem // (file name extension)
    timeout /t 3 /nobreak
    rem // Determine number of lines excluding header:
    for /F %%I in ('^< "%_FILE%" find /V /C ""') do set /A "COUNT=%%I-2"
    rem // Split file into multiple ones:
    setlocal EnableDelayedExpansion
    rem // Read file once:
    < "!_FILE!" (
    rem // Read header (first line):
    set /P HEADER1=""
    set /P HEADER2=""
    rem // Calculate number of output files:
    set /A "_DIV=(COUNT-1)/_LIMIT+1"
    Echo !_DIV!
    rem // Iterate over output files:
    for /L %%J in (1,1,!DIV!) do (
            rem // Write an output file:
            > "!NAME!_%%J_of_!_DIV!!EXT!" (
                rem // Write header:
                echo/!HEADER1!
                echo/!HEADER2!
                rem // Write as many lines as specified:
                for /L %%I in (1,1,%_LIMIT%) do (
                    set "LINE=" & set /P LINE=""
                    if defined LINE echo/!LINE!
                )
            )
        )
    )
    endlocal
    )
    endlocal
    exit /B
    
    setlocal EnableExtensions DisableDelayedExpansion
    设置/A“位置=C:\USER\”
    对于(*.csv)中的/R“C:\USER\Source\”%%f,请执行以下操作(
    rem//在此处定义常量:
    set _FILE=%%f&rem//(第一个命令行参数是输入文件)
    设置/A“_LIMIT=20”&rem//(每个输出文件的记录或行数)
    rem//拆分文件名:
    设置“NAME=C:\USER\Splitted\%%~nf”&rem/(路径和文件名)
    set EXT=.csv&rem//(文件扩展名)
    超时/t 3/nobreak
    rem//确定不包括标题的行数:
    对于/F%%I in(“^<“%\u文件%”查找/V/C”“”),请设置/A“计数=%%I-2”
    rem//将文件拆分为多个文件:
    setlocal EnableDelayedExpansion
    rem//读取文件一次:
    <“!\u文件!”(
    rem//读取标题(第一行):
    设置/P标题1=“”
    设置/P标题2=“”
    rem//计算输出文件的数量:
    设置/A“\u DIV=(计数-1)/\u限制+1”
    回声!
    rem//迭代输出文件:
    对于/L%%J in(1,1,!DIV!)do(
    rem//写入输出文件:
    >“!NAME!\uu%%J\u of\uu!\u DIV!!分机!”(
    rem//写入头:
    回声/!头1!
    回声/!头2!
    rem//按指定的行数写入:
    对于/L%%I in(1,1,%\u限制%)do(
    设置“行=“&set/P行=“”
    如果定义了LINE echo/!LINE!
    )
    )
    )
    )
    端部
    )
    端部
    退出/B
    
    请帮忙

    当前状态-仅创建了一个空文件-仅标题行。 文件名为-Book2\u 1\u of_1.csv 请参阅输出附件中的运行时


    谢谢

    在批处理文件中,例如,我们需要在
    %
    上加倍<对于/f%f的代码>应该是
    对于/f%%f
    设置文件=%f
    应该是
    设置文件=%f”
    谢谢!我改了。仍然不起作用虽然不起作用有点模糊。什么不起作用,发生了什么或没有发生什么?你调试过什么吗?首先删除
    @echo off
    以查看屏幕的输出。我尝试了调试,但无法在内部暂停以进行循环。就像当我添加外部for循环时,它停止了工作。所以我使用了timeout/t10/nobreak,但它在内部for中工作。外部的原因是腐败。有一件事可以肯定的是,你应该与你的delayedexpansion变量保持一致<代码>%\u文件%应该是
    _文件然后进行调试。删除@echo off,然后打开cmd并从那里运行脚本,而不是双击。