从纯文本文件中提取数字列表

时间:2010-12-06 15:33:44

标签: batch-file

我的文本文件包含类似模式的一系列数字:

<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

2 个答案:

答案 0 :(得分:1)

是的,但不是很漂亮。对此明显的选择是b正则表达式,您只需要在批处理文件中进行匹配(然后只是非常有限)。如果您使用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

答案 1 :(得分:-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