2013-10-01 94 views
0

我需要在批處理腳本中逐字讀取文本文件的內容。詞是空間分開的。我試過,但它不工作,只用了第一個字:閱讀批處理腳本中空格分隔的單詞

for /f "delims= " %%i in (%OUTPUT_FILE%) do echo %%i 

我也試過,但沒有也行:

for /f "tokens=* delims= " %%i in (%OUTPUT_FILE%) do echo %%i 
+0

我沒有找到一個解決方案,我everiting只嘗試發生在每行第一個字。 –

+0

我在我的文件(OUTPUT_FILE)中有這個:Hello World,我想讀:Hello(第一個詞)然後World(第二個詞)。 –

+0

使用「tokens = * delims =」的輸出是什麼? –

回答

0

這是一個純粹的批處理解決方案,應該能夠處理文件中的任何內容。它使用外部FOR/F讀取每行,並用換行符替換每個空格。它用內部的FOR/F讀取每個結果行(單詞)。

@echo off 
setlocal disableDelayedExpansion 

:: Define LF to contain a newline character 
set LF=^ 


:: Above 2 blank lines are critical - DO NOT REMOVE 

for /f "eol= tokens=*" %%A in (%OUTPUT_FILE%) do (
    set "ln=%%A" 
    setlocal enableDelayedExpansion 
    for %%L in ("!LF!") do for /f "eol= " %%W in ("!ln: =%%~L!") do echo %%W 
    endlocal 
) 

生活簡單得多,如果你使用hybrid JScript/batch utility called REPL.BAT執行正則表達式搜索和替換標準輸入,並將結果輸出到標準輸出。

假設REPL.BAT是在當前文件夾,或者更好的是,你的PATH中的某個地方:

for /f "eol= " %%W in ('repl " " "\n" x ^<%OUTPUT_FILE%') do echo %%W 
+0

很好的把戲設置LF。我將保存它以備將來使用。 應該enableDelayedExpansion真的被包含在循環中嗎?本地語句是否可以放在第一個循環中以減少重複調用? –

+1

@Locke - 如果該值包含'!',則延遲擴展將破壞'%% A'的擴展。這就是爲什麼在該值已分配後,我在循環內開啓和關閉延遲擴展。 – dbenham

+0

它的工作原理是這樣的,但我仍然有問題,Windows對命令長度有8K的限制。我的OUTPUT_FILE包含超過8K,當我這樣做時:「for/f」eol = tokens = *「%% A in(%OUTPUT_FILE%)」OUTPUT_FILE的內容被擴展,然後批處理腳本停止。你有什麼想法,我怎麼能克服這一點。謝謝。 –

3
for /f "delims=" %%a in (file.txt) do for %%b in (%%a) do echo %%b 

分隔符:空格,製表,0xFF,,;=

+0

如果文件中包含「*」或「?」字符,所有地獄都會打散 – dbenham

0

令牌控制從可用的分隔符分割的元素。因此,根據您的總體目標是什麼,可能需要追求令牌來檢索所需的變量。如果您知道文本文件的每一行有多少個元素,例如每行上的配置文件或鍵值對,則可以使用'tokens ='來獲得所需的內容。

for /f "tokens=1,2 delims= " %%a in (%OUTPUT_FILE) do echo %%a %%b 

如果每行的項目是未知的,Endoro的線循環內的字循環肯定是要走的路。

+1

什麼是'%% b'?您只定義了一個令牌。 '%% b'在這裏不是一個有效的變量名稱。 – Endoro

+0

我想展示如何在變量數組中選擇特定的位置,但您說得對,我可能需要將其更改爲令牌= 1,2以使%% b有效。我將不得不在控制檯中運行這個程序,我正在上班的路上在手機上打字。 –