2014-08-29 200 views
0

我試圖逐行閱讀一個文本文件,如果一行是空的,我期望它不應該是回聲-1行。批處理,如果行沒有文本,回顯以前的行

文本文件包含文字是這樣的:

Town 
Hereford 
C:\Installer.exe 
192840573 



Town 
Greenock 
C:\Installer.exe 
192840573 



Town 
York 



Town 
Ipswich 
C:\Installer.exe 
192840573 

我想這樣做是反響,紐約沒有Installer.exe的 這從一個城鎮到不同城市和多個鄉鎮可能有安裝程序失蹤。

所有幫助非常感謝。

+0

當我輸入的文件有新的線路我曾與\ r \ n,而是重新格式化後顯示的問題。 – 2014-08-29 12:46:21

+0

搜索網絡,並嘗試很多我不確定他們的過程的例子。 – 2014-08-29 13:17:05

+0

我還需要確定鎮是否有安裝程序檢查大小是否與預期一樣,例如192840573 – 2014-08-29 13:20:10

回答

1
@ECHO Off 
SET "Town=" 
SET "Townname=" 
SETLOCAL 
FOR /f "delims=" %%a IN (q25568537.txt) DO (
IF DEFINED town IF NOT DEFINED townname SET "townname=%%a" 
IF /i "%%a"=="Town" (
    IF DEFINED townname CALL ECHO %%townname%% 
    SET "Town=Y" 
    SET "Townname=" 
) 
IF /i "%%a"=="C:\Installer.exe" SET "Townname="&SET "town=" 
) 

IF DEFINED town IF DEFINED townname CALL ECHO %%townname%% 

GOTO :EOF 

我使用了一個名爲q25568537.txt的文件,其中包含我的測試數據。

請注意批處理環境變量不區分大小寫。 if /i語法使字符串比較不區分大小寫;這裏可能沒有必要,但在這種情況下也是無害的。

+0

這是完美的。非常感謝。 – 2014-08-29 14:23:12

+0

@corythompson - 如果啓用延遲擴展並且'CALL ECHO %% townname %%'被'echo!townname!'替換,這個解決方案可以快5倍。 – dbenham 2014-08-30 00:26:15

0

Magoo的解決方案可以工作,但對於大文件來說可能會很慢。

這是另一種使用FINDSTR跨越換行符搜索的解決方案。如果文件很小,那麼它沒關係。但是如果文件有數千行,那麼這個解決方案明顯更快(我的機器上的因子是6)。即使修改爲使用延遲擴展,該解決方案仍然比Magoo的解決方案稍快。

我必須創建一個臨時副本,附加額外的行以防萬一上一個城市缺少安裝程序。

我的代碼假定該文件名爲test.txt

@echo off 
setlocal enableDelayedExpansion 

set file=test.txt 

::Define LF variable containing a linefeed (0x0A) 
set ^"LF=^ 

^" Above empty line is critical - DO NOT REMOVE 

::Define CR variable containing a carriage return (0x0D) 
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a" 

(type "%file%"&echo(&echo()>"%file%.new" 
findstr /ir /c:"[a-z].*!CR!*!lf!!CR!*!LF!" "%file%.new" 
del "%file%.new" 
相關問題