2010-12-06 3 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> 

Можно ли написать окна пакетный сценарий для извлечения числа из файла и поместить его в новый файл?

о/р файл должен содержать

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.

Смежные вопросы