2016-09-27 26 views
0

我有幾個文本文件,其中每行以組代碼開頭,每個數據項由管道字符分隔。有一個特定的組有時會有數據,有時沒有數據,因此只有組代碼和管道。我試圖在沒有數據的情況下移除這些組,同時保留那些確實有數據的組。批處理 - 刪除包含管道的行

例如,兩條線在我的文件看起來像:

A01|ABC|123|XYZ| 
A05|123456789|| 
A05||| 
A01|DEF|456|UVW| 
A05|987654321|| 
A05||| 
A08|SOMEDATA| 

我希望它看起來像

A01|ABC|123|XYZ| 
A05|123456789|| 
A01|DEF|456|UVW| 
A05|987654321|| 
A08|SOMEDATA| 

我曾嘗試使用FINDSTR,如下圖所示:

type MYFILE.txt | findstr /v "A05|||" > MYFILE.txt 

但是,這是刪除文件中的所有內容,而不僅僅是包含A05的行。

回答

2

嘗試使用其他文件:

FindStr/RV "^A05||" MyFile.txt>AnotherFile.txt 

然後如果需要的話德爾 ETE myfile.txt文件 & AME AnotherFile.txt MyFile.txt的

+0

這工作完美,謝謝。 – Retify

+0

有一個'|'太少了(像'A05 || something |'這樣的字符串也會匹配)... – aschipfl

+0

我不認爲有,我認爲目的只是找到以A05字段開頭的行,然後是空的第二個字段。第三場內容對他們來說並不重要。 – Compo

1

你幾乎沒有,但在命令行中有兩個問題:

type MYFILE.txt | findstr /v "A05|||" > MYFILE.txt 
  1. 重定向> MYFILE.txt被施加到整個命令行,所以製備重定向時,(新的)空文件MYFILE.txt首次創建,則執行命令行。爲了避免這種情況,請將輸出重定向到另一個文件,然後將其移至原始文件。
  2. 搜索字符串只匹配以A05開頭的行,但不是像A06|||。要匹配這些行,請將搜索字符串更改爲|||$$將匹配定位到最後)。如果字段數量可能有所不同,您可以使用:^[^|]*|*$(意思是除|以外的任意數量的字符作爲組碼,後跟任意數量的相鄰|; ^開頭將匹配定位到行的開頭;以及將該匹配錨定到最後的$,它強制整行匹配給定模式)。

因此校正後的命令行看起來像這樣:

type "MYFILE.txt" | findstr /V "|||$" > "MYFILE.txt.tmp" & move /Y "MYFILE.txt.tmp" "MYFILE.txt" > nul 

或者,與可選的搜索字符串字段的可變數目:

type "MYFILE.txt" | findstr /V "^[^|]*|*$" > "MYFILE.txt.tmp" & move /Y "MYFILE.txt.tmp" "MYFILE.txt" > nul 

周圍的文件路徑引號/ name只是插入以產生更一般的語法,即使在發生空白或其他有毒字符時也不會失敗。

+0

不! - 添加括號並不能解決任何問題。在右側有機會執行重定向之前,您仍然有一種競爭條件,假設左側完成。一箇中等大小的文件會被你的建議截斷。如果不使用兩步處理和臨時文件(假設您堅持本地批處理),則無法正確覆蓋原始文件 – dbenham

+0

噢,是的,您是對的!我只是用來自問題的樣本數據進行了測試,所以我得出了一個錯誤的結論,但創建一個大約350行的類似文件被截斷。所以這意味着管道和重定向不是一次完成的,而是將數據分成若干塊數據,這是真的嗎? – aschipfl

+0

管道是異步的,右側絕對不會等待整個左側在開始之前完成。我不知道它是如何緩衝的。但我不認爲這是一個固定的大小。我知道它不是基於行的,因爲在用戶鍵入響應並按下[Enter]之前,右側的TEE程序將正確顯示SET/P提示。 – dbenham