2016-11-16 65 views
0

我有一个批处理脚本,它将所有.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

你应该知道的第一件事是你的例子不会做你认为它做的事。第二个命令行应该是'(对于(* .txt)中的%f,输入“%f”&echo。&echo,)>> output.txt'。 – Compo

+0

你想把10,000限制为'files'或'lines'吗? – lit

回答

2

有问题与您现有的代码:

  • 一个简单的for循环可能会包括你的输出文件(S)。显然你不想那样。这可以通过在创建任何输出之前将文件列表写入临时文件来防止。通过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 
+0

非常完美,非常感谢,我已经测试了脚本,它完全符合我的需求,而且速度也非常快! – user1016171