2010-12-06 18 views
0

我有一个包含一系列数字以下类似的模式文本文件:提取号码列表从纯文本文件

<Lorepsum ipsum lores aus Lorep NUM="100" aus Lore> 

<Lorepsum ipsum lores aus Lorpsum NUM="101" Lorepsum> 

<Lorepsum ipsum lores aus Lorp77dsum NUM="102" ipsum lores aus> 

<Lorepsum ipsum lores aus Lopsum NUM="103" lores aus> 

是否可以编写Windows批处理脚本来提取该文件的编号,放入一个新文件?

O/P文件应包含

101 
102 
103 
104 
+1

什么问题? yopu想从文件中找到什么?文本(根据您的主题建议)?或数字作为你的问题的主体建议。你能给出一些与你的示例输入相匹配的示例输出吗? – 2010-12-06 15:35:43

+0

感谢Paul.I需要提取数字并将其写入新文件。 – 2010-12-06 15:37:40

+0

输出文件应该包含“100”,“102”,“103” – 2010-12-06 15:43:51

回答

-1

这应该让你开始:

@echo off 
set cnt=0 
set max=9 
:enter_loop 

if %cnt% GTR %max% goto end_loop 
echo NUM="%cnt%" >> output.txt 
set /a cnt="cnt+1" 
goto enter_loop 

:end_loop 

pause 
1

是的,但它是不是很漂亮。这个明显的候选者将会使用正则表达式,这些正则表达式只能在批处理文件中进行匹配(然后才非常有限)。如果你使用PowerShell,那么它只是

Get-Content foo.txt | ForEach-Object { 
    [Regex]::Match($_, 'NUM="(\d+)"').Groups[1].Value 
} 

但遗憾的是,在批处理文件中,这有点复杂。

但是,您可以使用for /f解析文件,然后检查令牌。尽管如此,没有简单的方法可以通过令牌解析一个行标记。令牌化后停止31个令牌(如果我没有记错的话)。在任何情况下,下面的工作:

@echo off 
for /f "delims=" %%f in (foo.txt) do call :parse "%%f" 
goto :eof 

:parse 
setlocal enabledelayedexpansion 
set i=0 
:parseImpl 
set /a i+=1 
(
    for /f "tokens=%i% delims= " %%l in (%1) do (
    rem Jump out if no more tokens are there 
    if "%%l"=="" goto :eof 
    rem Remember the token 
    set T=%%l 
    if "!T:~0,4!"=="NUM=" (
     set N=!T:~4! 
     rem add redirection here if needed 
     echo !N:"=! 
    ) 
) 
) || goto :eof 
rem This above will cause the loop to stop once no more tokens are there. 
rem The for loop will return a non-zero exit code then. 
goto parseImpl 

这不是太漂亮,但相当简单。由于读取文件时,我只能使用每行一次,我将工作委派给一个子程序,该子程序会根据需要频繁执行。为此,使用变量i来跟踪当前令牌编号。然后使用另一个for循环从该字符串提取所请求的令牌。如果令牌以NUM=开头,则假定它是您想要的数字。它被清理并打印。

如果要直接它们放入一个文件,然后将相应线路更改为

>out.txt echo !N:"=! 

的代码也可以发现in my SVN