将多个文本文件与每个文件的限制组合在一起

时间:2016-11-16 16:59:59

标签: batch-file cmd

我有一个批处理脚本,它将所有.txt文件与一些警告相结合,例如在每个文件之间添加一个逗号,并在输出文件的开头和结尾添加一个方括号。

echo [ >> output.txt
for %f in (*.txt) do type "%f" >> output.txt & echo. >> output.txt & echo , >> output.txt
echo ] >> output.txt

我想做的是将output.txt限制为10,000个txt文件,同时为下一个10,000个文件创建一个新的output.txt。因此,对于25,000条记录,我将最终得到;

Output1.txt   (10,000 txt files)
Output2.txt   (10,000 txt files)
Output3.txt   (5,000 txt files)

如何更改我的脚本以适应这种情况?

如果可能的话,我真的不想在它结合的最后一条记录的末尾写一个逗号。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

现有代码存在问题:

  • 简单的FOR循环可能包含您的输出文件。显然你不希望这样。在创建任何输出之前,可以通过将文件列表写入临时文件来防止这种情况。通过DIR /B /A-D *.txt >tempFile

  • 轻松完成
  • 重复打开相同的输出文件需要花费大量时间。如果可能的话,更好(更快)打开一次。

理想情况下,最终代码应该在某种FOR循环中执行大部分处理,并使用延迟扩展来处理循环中更改的值。使用FOR循环读取文件名可能会导致延迟扩展问题,因为它会破坏恰好包含!的任何名称。它需要更多的代码,但使用SET / P来读取文件要快得多,延迟扩展不会导致问题。

通常,在使用SET / P时,您必须知道文件中的总行数以检测结束。但在这种情况下,连续缺少数据表示文件结束 - DIR / B输出中永远不会有任何空行。

以下代码未经测试,但如果不起作用,则任何修复都应该是次要的。

@echo off
setlocal enableDelayedExpansion
dir /b /a-d *.txt >files.temp
set /a cnt=0
call :read <files.temp
del files.temp
exit /b

:read
set "file="
set /p "file="
if not defined file exit /b
set /a cnt+=1
call :write >output%cnt%.txt
goto :read

:write
echo [
type "!file!"
echo(
for /l %%N in (2 1 10000) do (
  set "file="
  set /p "file="
  if not defined file goto :end
  echo ,
  type "!file!"
  echo(
)
:end
echo ]
exit /b