2017-02-02 72 views
0

我有很多文本文件。在那些文件中,只有幾行感興趣。我雖然認爲Batch能夠有效地處理我的問題,所以我花了最近兩天的時間來學習該語言的基礎知識。 基本上我想通過我所有的文件(爲了簡單起見,它們在同一個文件夾中),提取我需要的幾行文件,並將它們複製到輸出文件的一行中。在多個文本文件中提取一些行

到目前爲止,我對管理:

摘自每一個文件中的所有行同一個輸出文件

FOR %%f IN (*.whl) DO FOR /F "delims=|" %%l in (%%f) DO echo %%l >> output.txt 

從一個文件中提取(5和10)我想行

(FOR /L %%i IN (1,1,5) DO SET /P line1=) < file.txt 
(FOR /L %%i IN (1,1,10) DO SET /P line2=) < file.txt 
>> output.txt ECHO %line1% %line2% 

現在我試圖結合這兩個代碼:

該代碼給我的公司第一個文件的rect輸出,但不循環所有文件。如果我在:extract_lines塊的末尾添加goto nxt_file它只是再次執行第一個文件。

:nxt_file 
FOR %%f IN (*.whl) DO (
    set outfile=%%f 
    goto extract_lines) 

:extract_lines 
(FOR /L %%i IN (1,1,5) DO SET /P line1=) < %file% 
(FOR /L %%i IN (1,1,10) DO SET /P line2=) < %file% 
>> output.txt ECHO %line1% %line2% 

該代碼循環但無法複製我想要在輸出中的行。

FOR %%f IN (*.whl) DO (
    (FOR /L %%i IN (1,1,5) DO SET /P line1=) < %%f 
    (FOR /L %%i IN (1,1,10) DO SET /P line2=) < %%f 

    ECHO %line1% %line2% >> output.txt 
) 

但是,如果我改變它加入set file=%%f< %file%更換< %%f它不運行。

順便說一下,我用this method,這很好用,但我不知道我是否可以用我迄今使用的方法進行分類。

感謝您的幫助!

編輯:正如你可以看到這是我的第一篇文章,也是我在該語言中的第一步。我歡迎任何建議來提出這個問題,也許將來的問題更加詳細,因爲我可能無法感知與高級用戶相關的每個信息。

感謝@Magoo我的問題已解決,但我會有興趣的任何建議,以使此代碼更好(我想有一種更有效的方式來選擇只需要的行,而不是使用FOR /L,並通過每一個直到正確的那一行)。

此外,如果任何人對我描述的不同問題有解釋(例如< %%f而不是< %file%)將是最受歡迎的。

回答

0

似乎是一個XY問題,我(IOW - 嘗試修復的方法,而不是一個問題)

(這是未經測試,因爲它必須是,考慮到缺乏細節)

FOR %%f IN (*.whl) DO (
(FOR /L %%i IN (1,1,5) DO SET /P line1=) < %%f 
(FOR /L %%i IN (1,1,10) DO SET /P line2=) < %%f 
>> output.txt CALL ECHO %%line1%% %%line2%% 
) 

應該找到每個*.whl文件,分配名稱%%f,然後讀取該文件中的第一5行至line1和第一10至line2,而使第五的第十線在這兩個變量,那麼累加輸出s轉換output.txt

IF我正確地解釋你的方法...

+0

事實上,它解決我的問題!謝謝!但是,你能解釋一下我爲什麼需要寫'CALL ECHO'這是我第一次看到它寫的那樣。爲什麼'line1'和'line2'有兩組''%%'?我雖然已經足夠爲一個變量寫'%line1%'。你說的對,'FOR/L'似乎不是最好的方法。有沒有辦法直接按照我想要的路線行事?我儘可能詳細地解釋我的問題。我應該添加哪些信息才能更具體? – bcor

+0

'call echo %% var %%'使用解析技巧。由於'%%'解析爲'%'(所以你可以回顯'%'符號),該行被解釋爲'echo%var%',但是用當前環境的副本執行,因此顯示當前值變量。如果沒有'call',就會顯示'%var%'(字面意思),'echo%var%'會顯示var的vakue,就像當第一次輸入塊(括號內的一系列命令)時一樣。還有其他方法可以做到這一點 - 我所展示的是最簡單的方法。在本FAQ中搜索數百篇關於'delayedexpansion'的論文。 – Magoo

+0

我看不出用於選擇第5行和第10行的'for/L'方法有什麼不妥。幸運的是,它們是固定的行號 - 就像「第三次出現後的第五行」文件中的xyzzpl'實現起來會更困難。 – Magoo

1

您可以使用FindStr在單個For循環中完成所有操作。

@Echo Off 
>outfile.txt (For /F "Tokens=2* Delims=:" %%A In ('FindStr/N "^" *.whl' 
) Do If "%%A"=="5" (Set "_=%%B") Else If "%%A"=="10" (Call Echo=%%_%% %%B)) 
相關問題