2012-10-15 89 views
0

的部分我已經創建代碼遍歷的files.txt每一行,並確定如果該文件是carboatneither並將該信息存儲到SendType.txt。這是通過使用findstr命令並搜索boat.txtcar.txt的列表來完成的。本質上是代碼的設計方式,它將採取第一行files.txt,看看它是否可以找到car.txt中的字符串(如果car輸出爲SendType.txt),如果不是,它將搜索boat.txt中的字符串(如果字符串是在boat.txt發現,boat輸出到SendType.txt),如果字符串沒有在任何car.txt或boat.txt找到,則文本neither輸出到SendType.txt使用FINDSTR用正則表達式搜索字符串

現在整個串線的代碼搜索。每個字符串類似於11111_2222-22_2010-09-09_10-24-20.zip(​​= ID,2222-22 =型號,2010-09-09 =日期,10-24-20 =交易ID)。

我想替換當前的Findtr行,它搜索整行,搜索整個字符串,除了日期部分。我附上了我的代碼以供參考,以及一些正在輸入的文件的例子。提前致謝!

@echo off 
FOR /F %%a in (files.txt) do (
findstr %%a car.txt 
if errorlevel 1 (
findstr %%a boat.txt 
    if errorlevel 1 (
    echo neither >>SendType.txt 
) else (
    echo boat >>SendType.txt 
) 
) else (
    echo car >>SendType.txt 
) 
) 

car.txt 
11111_2222-22_2010-09-09_10-24-20.zip 
11112_2222-11_2011-11-09_10-24-25.zip 

boat.txt 
11122_1111-22_2012-04-09_11-29-56.zip 
11144_3333-11_2011-12-22_06-29-66.zip 

files.txt 
11122_1111-22_2000-01-01_11-29-56.zip 
11144_3333-11_2000-01-01_06-29-66.zip 
11155_1212-12_2000-01-01_11-19-69.zip 
11111_2222-22_2000-01-01_10-24-20.zip 
11112_2222-11_2000-01-01_10-24-25.zip 
12345_2233-12_2000-01-01_07-27-44.zip 

期望的輸出:

SendType.txt 
boat 
boat 
neither 
car 
car 
neither 

UPDATE 10/15 3:00 PM 使用dbenham的代碼和解析技術目前的方法是如下:

@echo off  
>SendType.txt ( 
for /f "tokens=1,2,3,4 delims=_" %%a in (filenames.txt) do ( 
findstr /c:"%%a_%%b_%%d" sneakernet.txt >nul && (echo sneakernet) || (  
findstr /c:"%%a_%%b_%%d" devmed.txt >nul && (echo devmed) || echo tanto 
     ) 
    ) 
) 

回答

2

如果ID的格式是固定的具有兩個_在日期之前,那麼解決方案很簡單:只需使用FOR/F來解析值。

我喜歡用&&||而不是測試ERRORLEVEL。另外,你不需要FINDSTR的輸出,所以你可以重定向到nul。您應該驗證該字符串是否與該行的開頭匹配。最後,你只需要重定向一次,所以你可以覆蓋而不是追加 - 更容易重複測試,因爲在開始之前不需要刪除。

@echo off 
>SendType.txt (
    for /f "tokens=1,2 delims=_" %%a in (files.txt) do (
    findstr /bc:"%%a_%%b" car.txt >nul && (echo car) || (
     findstr /bc:"%%a_%%b" boat.txt >nul && (echo boat) || echo neither 
    ) 
) 
) 


如果ID的格式(以及可能的長度)可以變化,但是日期部分的格式(長度)是恆定的,則可以使用一個子串:

@echo off 
setlocal enableDelayedExpansion 
>SendType.txt (
    for /f "delims=" %%a in (files.txt) do (
    set "ln=%%a" 
    findstr /bc:"!ln:~0,-23!" car.txt >nul && (echo car) || (
     findstr /bc:"!ln:~0,-23!" boat.txt >nul && (echo boat) || echo neither 
    ) 
) 
) 


如果ID和日期格式都不是常量,那麼我會通過刪除日期部分來更改boat.txt和car.txt的內容。然後你可以使用FINDSTR /G選項。由於bug in FINDSTR,因此需要/I選項。

car.txt 
11111_2222-22 
11112_2222-11 

boat.txt 
11122_1111-22 
11144_3333-11 

@echo off 
setlocal enableDelayedExpansion 
>SendType.txt (
    for /f "delims=" %%a in (files.txt) do (
    echo %%a|findstr /blig:car.txt >nul && (echo car) || (
     echo %%a|findstr /blig:boat.txt >nul && (echo boat) || echo neither 
    ) 
) 
) 

更新答案

現在我明白了要求,這應該解決的問題。我基本上在原始答案中使用了第一個代碼的變體,並且我已經轉向使用正則表達式。通過用[0-9]代替正則表達式中的每個.可以使測試更加嚴格。

@echo off 
>SendType.txt (
    for /f "tokens=1,2,4 delims=_" %%a in (files.txt) do (
    findstr /brc:"%%a_%%b_....-..-.._%%c" car.txt >nul && (echo car) || (
     findstr /brc:"%%a_%%b_....-..-.._%%c" boat.txt >nul && (echo boat) || echo neither 
    ) 
) 
) 
+0

非常感謝回覆。你的想法很好,但有一個問題我可能沒有在我的原始問題中說清楚:'files.txt'中有幾個會話,其中'ID'和'model'編號是相同的,但交易是不同。 (例如,存在'11122_1111-22_2000-01-01_11-29-56.zip'和'11122_1111-22_2010-04-04_11-29-59.zip')。所以文件不能通過簡單地使用字符串的開始(使用'ID'和'model')來分類。 'findstr'命令還必須考慮到'交易'編號。 –

+0

我已更新原始問題以顯示代碼的新更改。 'findstr'命令在基於'_'字符的解析中無法正常工作。 –

+0

@JeffK - 最終工作代碼添加到答案。 – dbenham