2012-11-08 26 views
4

我有一個要求,在Windows批處理文件中,從文本文件中讀取第一個可用行,將它傳遞給變量並標記爲已使用的名稱\行批處理文件讀取尚未使用的文本的第一行,然後標記爲已使用

該文件的一個示例如下。

蘋果

橙色

該腳本將與「蘋果」入手,通過「蘋果」到一個變量中的腳本以後使用(我知道如何做到這一點位),然後回寫該行讀取&蘋果,'&'作爲一個標誌,說它已被使用。

然後將文件看起來像:

&蘋果
梨樹下一次該批處理文件運行,將採取「梨」
橙色

,它傳遞給一個變量,它標記用&使它看起來像:

&蘋果
&梨
橙色

我開始試圖找到'&',然後試圖移動到下一行,但我失敗後大約12小時的嘗試。這是我到目前爲止..並不多:

for/f「tokens = 1」%l in('name.txt')do(Find/v「&」/ v「^ ----^$「)(對於/ F%N在(%升)DO(設定新名稱=%N))

由於

回答

6

the.file運行此將修改依次在每個線;

@echo off 
setlocal enabledelayedexpansion 
type nul > the.file.temp 
set last= 
for /F "tokens=*" %%A in (the.file) do (
    set line=%%A 
    if "!line:~0,1!" neq "&" if "!last!" equ "" (
     set last=!line! 
     set line=^&!line! 
    ) 
    echo !line! >> the.file.temp 
) 

echo last value is !last! 
type the.file.temp > the.file 

(如果該行不&和可變last開始是空的,放在last &行修改line與一家領先的&,始終追加line到一個臨時文件,重命名完成時)

+1

謝謝您!我不明白,但它的作品。謝謝! – idarryl

+1

我真的很抱歉,但是這超出了我的理解水平,我無法理解它將價值(例如蘋果)放在變量中,如果是這樣的話,那麼就是哪一個。如果沒有,我不能確定將腳本放在哪裏。謝謝 – idarryl

+1

在最後一行之後,數值在'!last!'例如'echo value is'!last!'' –

3

Alex k。有一個很好的答案,可能在大多數情況下都很好。 (我upvoted。)

但是,它會破壞包含!的任何文本。該限制可以通過在循環內開啓和關閉延遲擴展來解決。

該解決方案對於大小合理的文件可能足夠快。但是對於大文件,FOR循環會變得很慢。

我測試了一個包含2817行的190kb文件,並且Alex K.解決方案花了20秒時間進行一次運行。

這是一個完全不同的解決方案,不使用任何循環來處理0中相同的190kb文件。07秒 - 285倍的速度:)

@echo off 
setlocal enableDelayedExpansion 
set "file=test.txt" 
findstr /bv "$ &" "%file%" >"%file%.available" 
set "var=" 
<"%file%.available" set /p "var=" 
if defined var (
    >"%file%.new" (
    findstr /b "&" "%file%" 
    <nul set /p "=&" 
    type "%file%.available" 
) 
    move /y "%file%.new" "%file%" >nul 
) 
del "%file%.available" 

echo var=!var! 


更新:作爲評論的要求,這裏是代碼的大量註釋的版本。

@echo off 
setlocal enableDelayedExpansion 

:: Define the file to process 
set "file=test.txt" 

:: Write the unused lines to a temporary "available" file. We don't want any 
:: empty lines, so I strip them out here. There are two regex search strings; 
:: the first looks for empty lines, the second for lines starting with &. 
:: The /v option means only write lines that don't match either search string. 
findstr /bv "$ &" "%file%" >"%file%.available" 

:: Read the first available line into a variable 
set "var=" 
<"%file%.available" set /p "var=" 

:: If var defined, then continue, else we are done 
if defined var (

    REM Redirect output to a "new" file. It is more efficient to redirect 
    REM the entire block once than it is to redirect each command individulally 
    >"%file%.new" (

    REM Write the already used lines to the "new" file 
    findstr /b "&" "%file%" 

    REM Append the & without a new line 
    <nul set /p "=&" 

    REM Append the unused lines from the "available" file. The first appended 
    REM line is marked as used because of the previously written & 
    type "%file%.available" 
) 

    REM Replace the original file with the "new" content 
    move /y "%file%.new" "%file%" >nul 
) 

:: Delete the temp "available" file 
del "%file%.available" 

:: Display the result 
echo var=!var! 


我沒有測試過這一點,但我才意識到我可以寫寫入可用線以尋找與比&以外的字符開頭的行線:

findstr "^[^&]" "%file%" >"%file%.available" 
+0

+1令人印象深刻!但令人困惑......任何方式,你可以添加沉重的評論,解釋發生了什麼,如何,何時,何地......「老師,我的大腦已滿,我現在可以走了嗎?」 :) – Lizz

+0

@Lizz - 查看已更新的評論版本的答案。 – dbenham

+0

哇..從來沒有見過BATCH行以<符號開頭。偉大的評論!希望我可以給多個++!說,爲什麼需要這麼長時間才能添加評論?我的意思是32分鐘?你有沒有花時間去呼吸*? ;-D – Lizz

相關問題