2016-11-16 61 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