2012-10-15 50 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